题意:
题目描述
给定一个 $n\times m$ 的矩形,矩阵由黑白两种颜色组成,你可以进行一些操作,每次操作可以任选两个颜色相同格子,将以他们为对顶点构成的矩形染成与这两个点相同的颜色,问能不能将整个矩形染成相同的颜色。
有 $t$ 组数据。
输入格式
第一行一个整数 $t(1\le t\le 10^{4} )$,表示有 $t$ 组数据。
每组数据的第一行为两个整数 $n,m(1\le n,m\le 500)$,表示矩形的行数和列数。
接下来 $n$ 行,每行 $m$ 个字符,表示矩形的初始颜色。
输出格式
一共 $t$ 行,每行为 YES 或 NO,表示能否把这组数据中的矩形染成相同的颜色。
思路:
我们可以发现如果有两个对角的颜色相同,那么可以直接将整个矩形染色。
如果没有对角颜色相同,我们可以尝试着把其中某一对对角染成相同的颜色,以达到第一种情况。
如果在其中一个角所在的边和列上都有与它不同的颜色,我们就可以将这个角染成与它相反的颜色。
按此方法枚举每个角即可。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| #include<bits/stdc++.h> using namespace std; int t,n,m; bool f,f1; char a[1145][1145]; int main(){ cin>>t; while(t--){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; } } if(a[1][1]==a[n][m]||a[1][m]==a[n][1]){ cout<<"YES"<<endl; continue; } f1=f=0; for(int i=2;i<=n;i++){ if(a[i][1]!=a[1][1]){ f=1; break; } } for(int i=2;i<=m;i++){ if(a[1][m]!=a[1][1]){ if(f==1){ cout<<"YES"<<endl; f1=1; break; } } } if(f1==1){ continue; } f1=f=0; for(int i=1;i<=m-1;i++){ if(a[1][i]!=a[1][m]){ f=1; break; } } for(int i=2;i<=n;i++){ if(a[i][m]!=a[1][m]){ if(f==1){ cout<<"YES"<<endl; f1=1; break; } } } if(f1==1){ continue; } f1=f=0; for(int i=1;i<=n-1;i++){ if(a[i][1]!=a[n][1]){ f=1; break; } } for(int i=2;i<=m;i++){ if(a[n][i]!=a[n][1]){ if(f==1){ cout<<"YES"<<endl; f1=1; break; } } } if(f1==1){ continue; } f1=f=0; for(int i=1;i<=m-1;i++){ if(a[n][i]!=a[n][m]){ f=1; break; } } for(int i=1;i<=n-1;i++){ if(a[i][m]!=a[n][m]){ if(f==1){ cout<<"YES"<<endl; f1=1; break; } } } if(f1==1){ continue; } cout<<"NO"<<endl; } return 0; }
|