思路:

如果矩阵中只有一个 0,其余都是 1: 从 1 出发,走到唯一的 0,路径是 "10",不是回文;但如果能走到另一个 1,路径是 "11",是回文。 从唯一的 0 出发,走到任何 1,路径是 "01",不是回文。 如果矩阵中只有一个 1,其余都是 0: 从 0 出发,走到另一个 0,路径是 "00",是回文。 从唯一的 1 出发,走到任何 0,路径是 "10",不是回文。 一般情况: 当 0 和 1 的数量都大于等于 2 时,对于任意起点 (i,j): 如果起点是 0,总能找到另一个 0,路径 "0...0" 是回文。 如果起点是 1,总能找到另一个 1,路径 "1...1" 是回文。 因此,在这种情况下,所有位置的答案都是 Y。

代码:

#include <bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--){ int n,m,sum0=0,sum1=0; cin>>n>>m; string s[n+5]; for(int i=0;i<n;i++){ cin>>s[i]; } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(s[i][j]=='1'){ sum1++; } else{ sum0++; } } } if(sum0==1){ for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(s[i][j]=='1'){ cout<<'Y'; } else {cout<<'N';} } cout<<'\n'; } } else if(sum1==1){ for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(s[i][j]=='1'){ cout<<'N'; } else {cout<<'Y';} } cout<<'\n'; } } else{ for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cout<<'Y'; } cout<<'\n'; } } }

}