题目链接:http://codeforces.com/contest/957/problem/B
题意:给你一个n*m的字符数组,数组中有‘.’和‘#’两种字符(n,m<=50),题目给定一种操作,是每次可以选择任意行和列,这些行和列的交叉处将会被标记为‘#’,且每行每列在所有操作中只能被选择一次,问能否使用该操作使得初始全为‘.’的数组变成输入这样。可以输出Yes,否则输出No。
分析:由于题目限制每行每列只能选择一次,因此如果某两行在第j列如果都变成了‘#’,那么他们必然是一起选择,且和j列一起选,那么这两列的‘#’的分布应该完全相同。因此可以直接枚举列号,然后看哪些行在这一列有‘#’,只有所得的这些行完全相同,才输出Yes,否则输出No。
AC代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 char c[105][105]; 6 int n,m; 7 int main(){ 8 ios_base::sync_with_stdio(0); 9 cin.tie(0); 10 cin>>n>>m; 11 int num=0; 12 for(int i=1;i<=n;i++){ 13 for(int j=1;j<=m;j++){ 14 cin>>c[i][j]; 15 } 16 } 17 int result=0; 18 for(int j=1;j<=m;j++){ 19 int p=0; 20 int now; 21 if(result==1) break; 22 for(int i=1;i<=n;i++){ 23 if(result==1) break; 24 if(c[i][j]=='#'){ 25 if(p==0){ 26 now=i; 27 p=1; 28 } 29 else { 30 for(int j=1;j<=m;j++){ 31 if(c[i][j]!=c[now][j]) {result=1;break;} 32 } 33 } 34 } 35 } 36 } 37 if(result==0){ 38 cout<<"Yes"<<endl; 39 } 40 else cout<<"No"<<endl; 41 return 0; 42 }