题意:

题目描述

给定一个 $n\times m$ 的矩形,矩阵由黑白两种颜色组成,你可以进行一些操作,每次操作可以任选两个颜色相同格子,将以他们为对顶点构成的矩形染成与这两个点相同的颜色,问能不能将整个矩形染成相同的颜色。

有 $t$ 组数据。

输入格式

第一行一个整数 $t(1\le t\le 10^{4} )$,表示有 $t$ 组数据。

每组数据的第一行为两个整数 $n,m(1\le n,m\le 500)$,表示矩形的行数和列数。

接下来 $n$ 行,每行 $m$ 个字符,表示矩形的初始颜色。

输出格式

一共 $t$ 行,每行为 YESNO,表示能否把这组数据中的矩形染成相同的颜色。

思路:

我们可以发现如果有两个对角的颜色相同,那么可以直接将整个矩形染色。

如果没有对角颜色相同,我们可以尝试着把其中某一对对角染成相同的颜色,以达到第一种情况。

如果在其中一个角所在的边和列上都有与它不同的颜色,我们就可以将这个角染成与它相反的颜色。

按此方法枚举每个角即可。

代码:

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;
}