Description
Given a
M×
N
matrix
A.
A
ij
∈ {0, 1} (0 ≤ i < M, 0 ≤ j < N), could you find some rows that let every cloumn contains and only contains one 1.
Input
There are multiple cases ended by
EOF. Test case up to 500.The first line of input is
M,
N
(
M
≤ 16,
N
≤ 300). The next
M
lines every line contains
N
integers separated by space.
Output
For each test case, if you could find it output "Yes, I found it", otherwise output "It is impossible" per line.
Sample Input
3 3 0 1 0 0 0 1 1 0 0 4 4 0 0 0 1 1 0 0 0 1 1 0 1 0 1 0 0
Sample Output
Yes, I found it It is impossible
//此题尼玛就一dfs......补选赛的时候我既然做不出来。我真是弱爆了。。。弱爆了弱爆了 #include <iostream> #include <cstdio> #include <cstring> #include <string> using namespace std; bool vis[28][320]; bool flag=false; bool val[28]; int m,n; void dfs(int c) { int fuck=0; for(int i=1;i<=m;i++) { //先判断已选择的行中,这一列有多少个1了。如果没有1. //那就找一个1并且标记。如果找不到。那就false //如果有多个1,那么说明这样做是不行的。得回溯 if(val[i]&&vis[i][c]) fuck++; } if(fuck>1)return; if(fuck==1) { if(c<n)dfs(c+1); else flag=true; } if(fuck==0) { for(int i=1;i<=m;i++) { if(vis[i][c]&&!val[i]) { bool hehe=true; for(int j=1;j<c;j++) { if(vis[i][j]) { hehe=false; break; } } if(hehe) { val[i]=1; if(c<n)dfs(c+1); else flag=true; val[i]=0; } } } } } int main() { while(scanf("%d%d",&m,&n)==2) { memset(vis,0,sizeof(vis)); memset(val,0,sizeof(val)); int a; flag=false; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { scanf("%d",&a); vis[i][j]=a==1; } } dfs(1); if(flag)cout<<"Yes, I found it"<<endl; else cout<<"It is impossible"<<endl; } return 0; }