ccf 201512-2 消除类游戏
ccf 201512-2 消除类游戏
问题描述
消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。
现在给你一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。
请注意:一个棋子可能在某一行和某一列同时被消除。
现在给你一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。
请注意:一个棋子可能在某一行和某一列同时被消除。
输入格式
输入的第一行包含两个整数n, m,用空格分隔,分别表示棋盘的行数和列数。
接下来n行,每行m个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用1至9编号。
接下来n行,每行m个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用1至9编号。
输出格式
输出n行,每行m个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。如果一个方格中的棋子被消除,则对应的方格输出0,否则输出棋子的颜色编号。
样例输入
4 5
2 2 3 1 2
3 4 5 1 4
2 3 2 1 3
2 2 2 4 4
2 2 3 1 2
3 4 5 1 4
2 3 2 1 3
2 2 2 4 4
4 5
2 2 3 1 2
3 1 1 1 1
2 3 2 1 3
2 2 3 3 3
2 2 3 1 2
3 1 1 1 1
2 3 2 1 3
2 2 3 3 3
样例输出
2 2 3 0 2
3 4 5 0 4
2 3 2 0 3
0 0 0 4 4
3 4 5 0 4
2 3 2 0 3
0 0 0 4 4
2 2 3 0 2
3 0 0 0 0
2 3 2 0 3
2 2 0 0 0
3 0 0 0 0
2 3 2 0 3
2 2 0 0 0
样例说明
棋盘中所有的1以及最后一行的3可以被同时消除,其他的方格中的棋子均保留。
评测用例规模与约定
所有的评测用例满足:1 ≤ n, m ≤ 30。
深度优先搜索?不知道该不该这样说,因为搜索方向每次我只取了一个,总共有两个方向(向右,向下,为了防止重复)
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int dc[] = {0,1,0,-1};///顺时针 5 const int dr[] = {1,0,-1,0};///防止重复检索,只检索左边的和下边的 6 ///所以检索只会用到前两个参数,后两个参数用来反向查找 7 int a[31][31]; 8 int ans[31][31]; 9 int row,col; 10 bool inside(int x,int y) 11 { 12 return 0<=x && x<row && y>=0 && y<col; 13 } 14 15 void search(int x,int y,int len,int dir,int num) 16 {///当前检索的数字为num ,dir=0表示向右,dir=1表示向下 17 if(a[x][y] != num && len<3) 18 return; 19 else if(a[x][y] != num && len>=3) 20 {///改变ans[][]的状态 21 x += dr[dir+2];y+=dc[dir+2]; 22 while(inside(x,y) && a[x][y]==num) 23 { 24 ans[x][y] = 0; 25 x += dr[dir+2];y+=dc[dir+2]; 26 } 27 return; 28 } 29 int xx = x + dr[dir]; 30 int yy = y + dc[dir]; 31 if(inside(xx,yy)) 32 search(xx,yy,len+1,dir,num); 33 else if(len>=2)///连续的三个字块,查找下一个时越界 34 { 35 xx += dr[dir+2];yy+=dc[dir+2]; 36 while(inside(xx,yy) && a[xx][yy]==num) 37 { 38 ans[xx][yy] = 0; 39 xx += dr[dir+2];yy+=dc[dir+2]; 40 } 41 return; 42 } 43 } 44 int main() 45 { 46 47 while(cin>>row>>col) 48 { 49 ///输入 50 for(int i=0;i<row;i++) 51 for(int j=0;j<col;j++){ 52 cin>>a[i][j]; 53 ans[i][j] = a[i][j]; 54 } 55 56 for(int i=0;i<row;i++) 57 { 58 for(int j=0;j<col;j++) 59 { 60 search(i,j,0,0,a[i][j]); 61 search(i,j,0,1,a[i][j]); 62 } 63 } 64 65 ///输出 66 for(int i=0;i<row;i++){ 67 for(int j=0;j<col;j++){ 68 cout<<ans[i][j]; 69 if(j != col-1) cout<<" "; 70 } 71 cout<<endl; 72 } 73 74 } 75 return 0; 76 }