给一个 N x M 的正整数矩阵,第 i 行的第 j 个元素记为 Aij . 你可以进行若干次(或0次如下操作:选择某个 i , j 并把 A ;;替换成它除以2下取整的值。 现在的目标是通过若干次操作让这个矩阵中相邻的元素不相等,请问是否可行,如果可行,输出" YES 并输出进行操作过后的矩阵,否则输出 NO '。 PS :当矩阵的两个元素 Aij 和 Az 』满足 i - x + j -=1时我们称这两个元素相邻,例如,A2,2与A2,3相邻,但与A3,3不相邻。。 输入描述: 第一行一个整数 T 代表有 T 组测试数据。 每组测试数据的第一行为两个整数 N 、 M ,代表矩阵的行数和列数。 接下来的 N 行,每行 M 个整数,第 i 行的第 j 个整数代表 Aij .
时间: 2023-03-25 15:04:26 浏览: 75
可以通过若干次操作让矩阵中相邻的元素不相等。具体实现方法是,从左上角开始,对于每个元素,如果它与它右边或下面的元素相等,就将它除以2下取整,直到它与相邻元素不相等为止。这样操作下来,矩阵中相邻的元素就不会相等了。
代码实现如下:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
int n, m;
cin >> n >> m;
vector<vector<int>> a(n, vector<int>(m));
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
cin >> a[i][j];
}
}
bool flag = true;
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
if (j < m - 1 && a[i][j] == a[i][j+1]) {
while (a[i][j] == a[i][j+1]) {
a[i][j] /= 2;
}
if (a[i][j] == ) {
flag = false;
break;
}
}
if (i < n - 1 && a[i][j] == a[i+1][j]) {
while (a[i][j] == a[i+1][j]) {
a[i][j] /= 2;
}
if (a[i][j] == ) {
flag = false;
break;
}
}
}
if (!flag) {
break;
}
}
if (flag) {
cout << "YES" << endl;
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
} else {
cout << "NO" << endl;
}
}
return ;
}