Mystical Mosaic
题意:n*m的棋盘, 每次选一个行集合R和一个列集合C, 将行与列的交点染成黑色, 每次操作不能选择已选过的行或列, 问能否将白色棋盘染成给出状态;记录每一行的状态(二进制表示),然后枚举状态;
#include <cstdio> #include <cstring> #include <vector> using namespace std; int n, m; char G[60][60]; long long a[60]; int main(){ while(~scanf("%d%d", &n, &m)){ for(int i=0; i<n; i++){ scanf("%s", G[i]); } memset(a, 0, sizeof(a)); for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ a[i]=(a[i]<<1)+(G[i][j]=='#'); } } int flag=0; for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ if(a[i]!=a[j]&&(a[i]&a[j])){ flag=1; break; } } if(flag) break; } if(!flag) printf("Yes\n"); else printf("No\n"); } return 0; }