CCF2015122消除类游戏(C语言版)

问题描述
  消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有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 }
原文地址:https://www.cnblogs.com/roadofstudy/p/6545091.html