c++消消乐问题
输入的第一行包含两个整数 n, m,用空格分隔,分别表示棋盘的行数和列数。
接下来 n 行,每行 m 个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用 1 至 9 编号。
输出格式
输出 n 行,每行 m 个整数,相邻的整数之间使用一个空格分隔,表示经过一次消除后的棋盘。
如果一个方格中的棋子被消除,则对应的方格输出 0,否则输出棋子的颜色编号
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n,m;
cin>>n;
cin>>m;
int a[n][m];
int i=0,j=0;
for(j=0;j<n;j++)
{
for(i=0;i<m;i++)
{
cin>>a[j][i];
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[j][i]==a[j+1][i]&&a[j+1][i]==a[j+2][i])
{
a[j][i]=0;
a[j+1][i]=0;
a[j+2][i]=0;
}
else if(a[j][i]==a[j][i+1]&&a[j][i+1]==a[j][i+2])
{
a[j][i]=0;
a[j][i+1]=0;
a[j][i+2]=0;
}
}
}
for(j=0;j<m;j++)
{
for(i=0;i<m;i++)
{
cout<<a[j][i]<<" ";
}
cout<<endl;
}
}
/*实验数据一
4 5
3 5 6 7 5
5 5 4 6 5
2 5 6 5 4
3 4 5 5 5
实验数据二
5 6
3 4 5 6 6 6
4 3 5 7 5 5
4 5 5 5 6 1
3 6 7 5 7 3
2 5 7 8 1 2
*/
2个办法
1.判断的代码不变,但循环时把需要消除的先记录下来,统一消除,不要直接删
2.判断需要消除的代码,不要先判断横向,再判断纵向,一开始就考虑到交叉的情况
直接在a数组修改是不可以的;
比如遇到
1 2 1
2 2 2
1 2 1
这样的情况(即横竖都能消除的情况),a数组就会变成
1 2 1
0 0 0
1 2 1
而第二列这样就消不了了。
所以我的建议是,可以再开一个数组,对照着原先的图进行操作。
建议把需要删除的坐标先保存起来,之后再删除