消灭星星的数组高效率算法(c++代码,控制台程序)
#include <iostream> using namespace std; #define ROW 12 #define COL 10 class 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; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。