现在给你一个 n行 m列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。
请注意:一个棋子可能在某一行和某一列同时被消除。
接下来 n行,每行 m个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用1至9编号。
2 2 3 1 2
3 4 5 1 4
2 3 2 1 3
2 2 2 4 4
3 4 5 0 4
2 3 2 0 3
0 0 0 4 4
2 2 3 1 2
3 1 1 1 1
2 3 2 1 3
2 2 3 3 3
3 0 0 0 0
2 3 2 0 3
2 2 0 0 0
所有的评测用例满足:1 ≤ n, m ≤ 30。
参考代码:
#include <iostream>
#include <cmath>//abs头文件
using namespace std;
int main(){
int n, m;
cin >> n >> m;
int **t = new int *[n];//二维数组声明
for (int i = 0; i < n;i++)
{
t[i] = new int[m];
for (int j = 0; j < m;j++)
{
cin >> t[i][j];
}
}
for (int i = 0; i < n;i++)
{
//找到每行三个绝对值相同的数置为负数
for (int j = 0; j < m-2;j++)
{
if(abs(t[i][j]) == abs(t[i][j + 1]) && abs(t[i][j + 1]) == abs(t[i][j + 2]))
{
if (t[i][j]>0)
{
t[i][j] = -t[i][j];
}
if(t[i][j+1]>0)
{
t[i][j + 1] = -t[i][j + 1];
}
if (t[i][j+2] > 0)
{
t[i][j + 2] = -t[i][j + 2];
}
}
}
}
for (int j = 0; j < m; j++)
{
//找到每列三个绝对值相同的数置为负数
for (int i = 0; i < n - 2; i++)
{
if (abs(t[i][j]) == abs(t[i+1][j]) && abs(t[i+1][j]) == abs(t[i+2][j]))
{
if (t[i][j]>0)
{
t[i][j] = -t[i][j];
}
if (t[i+1][j]>0)
{
t[i+1][j] = -t[i+1][j];
}
if (t[i+2][j] > 0)
{
t[i+2][j] = -t[i+2][j];
}
}
}
}
for (int i = 0; i < n;i++)
{
for (int j = 0; j < m;j++)
{
//判断每个数是负数的置为0
if (t[i][j]<0)
{
t[i][j] = 0;
}
//输出矩阵
cout << t[i][j] << " ";
}
cout << endl;
}
return 0;
}
提交结果:
代码长度 | 编程语言 | 评测结果 | 得分 | 时间使用 | 空间使用 |
---|
1.096KB | C++ | 正确 | 100 | 0ms | 508.0KB |