题目
样例输入1
4 5
2 2 3 1 2
3 4 5 1 4
2 3 2 1 3
2 2 2 4 4
样例输出1
2 2 3 0 2
3 4 5 0 4
2 3 2 0 3
0 0 0 4 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 2 3 0 2
3 0 0 0 0
2 3 2 0 3
2 2 0 0 0
思路
申请一个 bool 型数组 is,表示每个方格是否被消去。
对每一行,判断是否存在相同颜色的方格连续出现3次及以上:存储当前颜色 now 以及当前颜色方格连续的数目 num,一旦颜色发生变化,判断num大小,如果num >= 3,则将之前颜色相同的连续方格清空(对 is 数组进行操作,而不操作原数组,防止列的操作难以判断相同颜色方格是否连续)。
输出时如果方格颜色被清空,输出0,否则输出其原有的颜色。
代码
#include<iostream>
#include<cstring>
using namespace std;
bool is[35][35];
int a[35][35];
int main()
{
memset(is, 0, sizeof is);
int m, n;
cin >> m >> n;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
cin >> a[i][j];
int now;
int num = 1;
for (int i = 0; i < m; i++)
{
now = a[i][0];
num = 1;
for (int j = 1; j < n; j++)
{
if (a[i][j] == now) num++;
else
{
if(num>=3)
for (int k = j - 1; k >= j - num; k--)
{
is[i][k] = 1;
}
num = 1;
now = a[i][j];
}
}
if (num >= 3)
for (int k = n - 1; k >= n - num; k--)
{
is[i][k] = 1;
}
}
for (int j = 0; j < n; j++)
{
now = a[0][j];
num = 1;
for (int i = 1; i < m; i++)
{
if (a[i][j] == now) num++;
else
{
if (num >= 3)
for (int k = i - 1; k >= i - num; k--)
{
is[k][j] = 1;
}
num = 1;
now = a[i][j];
}
}
if (num >= 3)
for (int k = m - 1; k >= m - num; k--)
{
is[k][j] = 1;
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n - 1; j++)
{
if (is[i][j]) cout << 0 << " ";
else cout << a[i][j] << " ";
}
if (is[i][n - 1]) cout << 0;
else cout << a[i][n - 1];
cout << endl;
}
system("Pause");
}