消灭星星的数组高效率算法(c++代码,控制台程序)

#include <iostream>using namespace std;#define ROW 12#define COL 10class Star{public:enum Stat_star{willRemoved = -2,hasRemoved, normal};Star(){for (unsigned i = 0; i < ROW; i++){for (unsigned j = 0; j < COL; j++){m_arr[i][j].state = normal;m_arr[i][j].visited = false;}}}~Star(){}void print(){cout << "=====================" << endl;for (unsigned i = 0; i < ROW; i++){for (unsigned j = 0; j < COL; j++){cout << m_arr[i][j].data << "(" << m_arr[i][j].state << ")" << "\t";}cout << endl;}}void resetVisited(){for (unsigned i = 0; i < ROW; i++){for (unsigned j = 0; j < COL; j++){if(m_arr[i][j].state != hasRemoved){m_arr[i][j].visited = false;}}}}//检测是否游戏结束bool checkGameOver(){for (unsigned i = 0; i < ROW; i++){for (unsigned j = 0; j < COL; j++){if(findWillRemove(i, j) > 1){return false;}}}return true;}//检测是否要整列移动void checkColMove(){int dt = 0;//列的增量for (int i = 0; i < COL – dt; i++){bool allRemoved = true;//检测某列是否整列为空for (int j = 0; j < ROW; j++){if(m_arr[j][i].state != hasRemoved){allRemoved = false;break;}}//开始移动列if(allRemoved){for (int x = i; x < COL; x++){for (int y = 0; y < ROW; y++){if(x + 1 < COL){Star_data tempStar = m_arr[y][x];m_arr[y][x] = m_arr[y][x + 1];}}}//最后一列置空for (int y = 0; y < ROW; y++){m_arr[y][COL – 1].state = hasRemoved;}i–;dt++;}}}//找到相同的球后,,删除相同的球void removeSameStar(){//以列来找for (int j = 0; j < COL; j++){for (int i = ROW – 1; i >= 0; i–){if(m_arr[i][j].state == willRemoved){Star_data tempStar = m_arr[i][j];//依次把星星下移,并且把空的星星放到最上面for (int x = i; x >= 0; x–){if(x – 1 >= 0){m_arr[x][j] = m_arr[x – 1][j];}}m_arr[0][j] = tempStar;m_arr[0][j].state = hasRemoved;i++;}}}}//点击某个星星。找到将要被移除的星星int findWillRemove(int i, int j){int findCount = 0;findWillRemove(i, j, findCount);resetVisited();return findCount;}//查找将要被移除的void findWillRemove(int i, int j, int &findCount){if(i >= ROW || i < 0 || j >= COL || j < 0 || m_arr[i][j].state == hasRemoved || m_arr[i][j].visited){return;}m_arr[i][j].visited = true;findCount++;//左if(i – 1 >= 0 && m_arr[i – 1][j].state != hasRemoved && m_arr[i – 1][j].data == m_arr[i][j].data){m_arr[i][j].state = willRemoved;m_arr[i – 1][j].state = willRemoved;findWillRemove(i – 1, j, findCount);}//右if(i + 1 < ROW && m_arr[i + 1][j].state != hasRemoved && m_arr[i + 1][j].data == m_arr[i][j].data){m_arr[i][j].state = willRemoved;m_arr[i + 1][j].state = willRemoved;findWillRemove(i + 1, j, findCount);}//上if(j + 1 < COL && m_arr[i][j + 1].state != hasRemoved && m_arr[i][j + 1].data == m_arr[i][j].data){m_arr[i][j].state = willRemoved;m_arr[i][j + 1].state = willRemoved;findWillRemove(i, j + 1, findCount);}//下if(j – 1 >= 0 && m_arr[i][j – 1].state != hasRemoved && m_arr[i][j – 1].data == m_arr[i][j].data){m_arr[i][j].state = willRemoved;m_arr[i][j – 1].state = willRemoved;findWillRemove(i, j – 1, findCount);}}struct Star_data{int data;//数据Stat_star state;//状态bool visited;//是否访问};Star_data m_arr[ROW][COL];};int main(){Star star;int arr[ROW][COL] = {2, 1, 3, 2, 1, 2, 1, 3, 2, 1,2, 2, 5, 1, 2 ,2, 2, 5, 1, 2,3, 2, 1, 3, 3, 3, 2, 1, 3, 3,2, 5, 4, 1, 4, 2, 5, 4, 1, 4,2, 2, 3, 2, 5,2, 2, 3, 2, 5,2, 1, 3, 2, 1, 2, 1, 3, 2, 1,2, 2, 5, 1, 2 ,2, 2, 5, 1, 2,3, 2, 1, 3, 3, 3, 2, 1, 3, 3,2, 5, 4, 1, 4, 2, 5, 4, 1, 4,2, 2, 3, 2, 5,2, 2, 3, 2, 5,2, 5, 4, 1, 4, 2, 5, 4, 1, 4,2, 2, 3, 2, 5,2, 2, 3, 2, 5};for (unsigned i = 0; i < ROW; i++){for (unsigned j = 0; j < COL; j++){star.m_arr[i][j].data = arr[i][j];}}star.print();star.findWillRemove(0, 0);star.print();star.removeSameStar();star.print();star.checkColMove();star.print();star.checkGameOver() ? cout <<"over" : cout <<"not over";system("pause");return 0;}

用敬业的精神去面对每一份挑战,

消灭星星的数组高效率算法(c++代码,控制台程序)

相关文章:

你感兴趣的文章:

标签云: