问题描述消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。
现在给你一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。
请注意:一个棋子可能在某一行和某一列同时被消除。输入格式输入的第一行包含两个整数n, m,用空格分隔,分别表示棋盘的行数和列数。
接下来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 0 2
3 4 5 0 4
2 3 2 0 3
0 0 0 4 4样例说明棋盘中第4列的1和第4行的2可以被消除,其他的方格中的棋子均保留。样例输入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 0 2
3 0 0 0 0
2 3 2 0 3
2 2 0 0 0样例说明棋盘中所有的1以及最后一行的3可以被同时消除,其他的方格中的棋子均保留。评测用例规模与约定所有的评测用例满足:1 ≤ n, m ≤ 30。
解题思路:
建立二维数组,检查每一行每一列,如果有连续的三个及以上的元素相等,则将这些位置的值赋值为0.另外由于需要对行列都检查,如果先对行检查后将满足条件的元素赋值为0,那么在检查列的时候就对对结果造成影响;反之亦然。因此需要另外再建立一个复制的二维数组,一个处理行,一个处理列;最后将复制的数组中的为0的元素赋值给原数组中对应的元素。输出原数组就行。
代码见下:
1 #include<stdio.h> 2 3 int main() 4 { 5 int i , j ,k ,pos ,count ; 6 int n , m; 7 int a1[30][30], a2[30][30]; 8 scanf("%d%d",&n , &m); 9 for(i= 0 ; i< n ; i++) 10 for(j = 0 ; j <m ; j++) 11 scanf("%d", &a1[i][j]); 12 13 for(i= 0 ; i< n ; i++) 14 for(j = 0 ; j <m ; j++) 15 a2[i][j] = a1[i][j]; 16 17 for(i=0;i<n;i++) 18 {//处理数组的行 19 for(j=0;j<m;j++) 20 { 21 count = 1; 22 for(k=j+1;k<m;k++) 23 {//针对每一行的元素,参照冒泡的思路,从a[i][j]开始将元素逐一于其对比 24 if(a1[i][j] != a1[i][k])//如果 相等的数没达到3个,则终端对比,重新去对比参照数a[i][j+1] 25 break; 26 else 27 count ++; //记录相等的数的数量 28 } 29 if(count >= 3)//若相等的数的数量超过3个, 30 for(k = j ; k < count+j ; k++) 31 { 32 a1[i][k] = 0 ; 33 } 34 } 35 } 36 37 for(j=0;j<m;j++) 38 {//处理数组的列 39 for(i=0;i<n;i++) 40 { 41 count = 1; 42 for(k=i+1;k<n;k++) 43 { 44 if(a2[i][j] != a2[k][j]) 45 break; 46 else 47 count ++; 48 } 49 if(count >= 3) 50 for(k = i ; k < count+i ; k++) 51 { 52 a1[k][j] = 0 ; 53 } 54 } 55 } 56 57 for(i= 0 ; i< n ; i++) 58 for(j = 0 ; j <m ; j++) 59 if(a2[i][j] == 0) a1[i][j] = a2[i][j]; 60 61 for(i= 0 ; i< n ; i++){ 62 for(j = 0 ; j <m-1 ; j++) 63 printf("%d ",a1[i][j]); 64 printf("%d ",a1[i][m-1]); 65 } 66 return 0; 67 }