POJ 3740 Easy Finding
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int R=20; const int C=305; int A[R][C]; int n,m; int ff[R][R]; int flag; int U[R]; int cnt; int sum[C]; void DFS(int tot,int x,int now) { int ii,i,j; int fail=0; if(x==tot) { if(cnt==m)flag=1; return; } if(now>n) return; for(i=0;i<x;i++) if(ff[U[i]][now]==1) fail=1; if(fail==0) { U[x]=now; cnt=cnt+sum[now]; DFS(tot,x+1,now+1); cnt=cnt-sum[now]; if(flag) return; } DFS(tot,x,now+1); if(flag) return; } int main() { int i,j,k; while(~scanf("%d%d",&n,&m)) { for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&A[i][j]); memset(ff,0,sizeof(ff)); memset(sum,0,sizeof(sum)); for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) for(k=1;k<=m;k++) if(A[i][k]==1&&A[j][k]==1) { ff[i][j]=1; ff[j][i]=1; break; } flag=0; for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(A[i][j]==1) sum[i]++; cnt=0; for(i=1;i<=n;i++) { DFS(i,0,1); if(flag) break; } if(flag) printf("Yes, I found it\n"); else printf("It is impossible\n"); } return 0; }