思路:
1. 查看第一行有没有连续三个同样的数,有的话开始计数,直到数字不同为止。此时把找到的结果(格式为(起点数字的所在行、起点数字所在列、长度))压入一个向量(vector)。继续从下一个数字开始找。比如第一行数字是: 1 1 1 1 2 2 2,那么会把(0,0,4),(0,1,3),(0,4,3)压入向量。
2. 上面一种情况是有三个连续的数字相同的,若没有三个连续的数字相同,直接看本行的下一个数字
3. 用同样的方法查找列,压入另一个向量
4. 根据向量的数据,把相应的数字设为 0,当然可能有的数字被设为 0 后再次被设为 0,但结果一样。
代码如下:
#include <iostream>
#include <vector>
using namespace std;
struct record //记录一串消去的数字的第一个数字所在位置和消去的数字个数
{
int row;
int col;
int len;
record(int r=0, int c=0, int l=0):row(r),col(c), len(l){}
};
int main()
{
int n, m;
int a[30][30]; //保存输入的矩阵
vector<record> rowr;
vector<record> colr;
//freopen("t4.txt", "r", stdin);
cin>>n>>m;
for(int i=0; i<n*m; i++) cin>>a[i/m][i%m];
if(n <3 && m<3) //如果矩阵行列数均小于3,那直接输出就可以了
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
else
{
int nn = n-3, mm = m-3;
int len(0);
for(int i=0; i<n; i++) //行遍历
for(int j=0; j<= mm; ) //每行数字遍历 ,注意用 mm 控制不超过边界
{
len = 0;
if(a[i][j] == a[i][j+1] && a[i][j+1] == a[i][j+2]) //如果连续三个数相等
{
while((j + len < m) && (a[i][j+len] == a[i][j]))
++len;
rowr.push_back(record(i, j, len));
++j;
}
else
++j;
}
for(int i=0; i<m; i++) //列遍历
for(int j=0; j<= nn; )
{
len = 0;
if(a[j][i] == a[j+1][i] && a[j+1][i] == a[j+2][i])
{
while(j + len < n && a[j+len][i] == a[j][i])
++len;
colr.push_back(record(j, i, len));
++j;
}
else
++j;
}
for(int k=0; k<rowr.size(); k++) //消行中的相同数字
{
int ii = rowr[k].row, jj = rowr[k].col, le = rowr[k].len;
for(int j=0; j<le; j++)
a[ii][jj+j] = 0;
}
for(int k=0; k<colr.size(); k++) //消列中的相同数字
{
int ii = colr[k].row, jj = colr[k].col, le = colr[k].len;
for(int i=0; i<le; i++)
a[ii+i][jj] = 0;
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}