//DLX //数组开小了TLE 1天 悲剧~~~ #include <iostream> #include <queue> #include <stack> #include <string> #include <map> #include <vector> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int MAXM=20,MAXN=305,INF=1<<30; const int h=0; int R[MAXM*MAXN],L[MAXM*MAXN],U[MAXM*MAXN], D[MAXM*MAXN],Col[MAXM*MAXN],S[MAXM]; bool ok; int m,n,cnt; int deep,ans[MAXM*MAXN],Row[MAXM*MAXN]; void init(){ for(cnt=1;cnt<=n;cnt++){ L[cnt]=cnt-1; R[cnt]=cnt+1; U[cnt]=cnt; D[cnt]=cnt; Col[cnt]=cnt; S[cnt]=0; } cnt=n; L[h]=n; R[h]=1; R[n]=h; return ; } inline void remove(int &c){ L[R[c]]=L[c]; R[L[c]]=R[c]; for(int i=D[c];i!=c;i=D[i]){ for(int j=R[i];j!=i;j=R[j]){ U[D[j]]=U[j]; D[U[j]]=D[j]; --S[Col[j]]; } } return ; } inline void resume(int &c){ for(int i=U[c];i!=c;i=U[i]){ for(int j=L[i];j!=i;j=L[j]){ ++S[Col[j]]; U[D[j]]=j; D[U[j]]=j; } } L[R[c]]=c; R[L[c]]=c; return ; } bool dfs(){ if(R[h]==h) return true; int minVal=INF,idx=R[h]; for(int i=R[h];i!=h;i=R[i]){ if(S[i]<minVal){ minVal=S[i]; idx=i; if(minVal==1) break; } } remove(idx); for(int i=D[idx];i!=idx;i=D[i]){ for(int j=R[i];j!=i;j=R[j]){ remove(Col[j]); } ans[deep++]=Row[i]; if(dfs()) return true; --deep; for(int j=L[i];j!=i;j=L[j]){ resume(Col[j]); } } resume(idx); return false; } int main() { #ifndef ONLINE_JUDGE freopen("i.txt", "r", stdin); #endif bool flag; int t,pre,ColLast,start; while(scanf("%d%d",&m,&n)==2){ init(); for(int i=1;i<=m;i++){ pre=0; for(int j=1;j<=n;j++){ scanf("%d",&t); if(t){ ColLast=U[j]; U[++cnt]=ColLast; D[cnt]=j; U[D[cnt]]=cnt; D[U[cnt]]=cnt; L[cnt]=pre?pre:cnt; R[cnt]=pre?R[pre]:cnt; L[R[cnt]]=cnt; R[L[cnt]]=cnt; Col[cnt]=j; ++S[j]; Row[cnt]=i; pre=cnt; } } } flag=true; for(int i=1;i<=n;i++){ if(S[i]==0){ flag=false; break; } } if(flag){ deep=0; ok=dfs(); } if(flag&&ok){ printf("Yes, I found it/n"); } else{ printf("It is impossible/n"); } } return 0; }