对于程序中相似的几部分也不要复制粘贴,还是要按照思路走一遍。
#include<iostream>
using namespace std;
int chess[30][30];
int result[30][30];
int main()
{
int n,m;
cin>>n>>m;
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
cin>>chess[i][j];
for(int i=0;i<n;i++)
for (int j=0;j<m;j++)
result[i][j]=-1;
for(int i=0;i<n;i++)
{
for(int j=2;j<m;j++)
{
if(chess[i][j-2]==chess[i][j-1]&&chess[i][j-1]==chess[i][j])
{
result[i][j-2]=result[i][j-1]=result[i][j]=0;
}
else
{
for(int m=0;m<3;m++)
{
if(result[i][j-m]!=0)
{
result[i][j-m]=chess[i][j-m];
}
}
}
}
}
for(int j=0;j<m;j++)
for(int i=2;i<n;i++) //for(int i=0;i<n;i++)就不对了,因为会数组溢出
{
if(chess[i-2][j]==chess[i-1][j]&&chess[i-1][j]==chess[i][j])
{
result[i-2][j]=result[i-1][j]=result[i][j]=0;
}
else
{
for(int m=0;m<3;m++)
{
if(result[i-m][j]!=0)
{
result[i-m][j]=chess[i-m][j];
}
}
}
}
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
cout<<result[i][j]<<" ";
cout<<endl;
}
return 0;
}
还可以采用一种不使用额外存储的做法,需要消除的元素暂时将其值变为相反数(负数),等行和列标记之后,再统一消除(置值)为0,最后输出结果。
使用函数memset()对数组进行初始化是套路。,memset(void *arr,int c,unsigned long size)是在<string.h>头文件中
/* CCF201512-2 消除游戏 */
#include <iostream>
#include <cmath>
using namespace std;
const int N = 30;
int grid[N][N], n, m;
int main()
{
// 输入数据
cin >> n >> m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++) {
cin >> grid[i][j];
}
// 进行行标记(可以消除则置为负)
for(int i=0; i<n; i++)
for(int j=0; j<m-2; j++) {
if(abs(grid[i][j]) == abs(grid[i][j+1]) && abs(grid[i][j+1]) == abs(grid[i][j+2])) {
if(grid[i][j] > 0)
grid[i][j] = - grid[i][j];
if(grid[i][j+1] > 0)
grid[i][j+1] = - grid[i][j+1];
if(grid[i][j+2] > 0)
grid[i][j+2] = - grid[i][j+2];
}
}
// 进行列标记(可以消除则置为负)
for(int j=0; j<m; j++)
for(int i=0; i<n-2; i++) {
if(abs(grid[i][j]) == abs(grid[i+1][j]) && abs(grid[i+1][j]) == abs(grid[i+2][j])) {
if(grid[i][j] > 0)
grid[i][j] = - grid[i][j];
if(grid[i+1][j] > 0)
grid[i+1][j] = - grid[i+1][j];
if(grid[i+2][j] > 0)
grid[i+2][j] = - grid[i+2][j];
}
}
// 进行清除(可以消除则置为0)并且输出结果
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(grid[i][j] < 0)
grid[i][j] = 0;
if(j != 0)
cout << " ";
cout << grid[i][j];
}
cout << endl;
}
return 0;
}