codeforces 957B Mystical Mosaic

题目链接:http://codeforces.com/contest/957/problem/B

题意:给你一个n*m的字符数组,数组中有‘.’和‘#’两种字符(n,m<=50),题目给定一种操作,是每次可以选择任意行和列,这些行和列的交叉处将会被标记为‘#’,且每行每列在所有操作中只能被选择一次,问能否使用该操作使得初始全为‘.’的数组变成输入这样。可以输出Yes,否则输出No。

分析:由于题目限制每行每列只能选择一次,因此如果某两行在第j列如果都变成了‘#’,那么他们必然是一起选择,且和j列一起选,那么这两列的‘#’的分布应该完全相同。因此可以直接枚举列号,然后看哪些行在这一列有‘#’,只有所得的这些行完全相同,才输出Yes,否则输出No。

AC代码:

 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 }
View Code
原文地址:https://www.cnblogs.com/ls961006/p/8660429.html