#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int m,n;
int map[20][350];
int vis[350];
bool pan1()
{
for(int i=0;i<n;i++)
if(vis[i]==0)return false;
return true;
}//判断是否某一列完全没有1
bool pan2()
{
for(int i=0;i<n;i++)
if(vis[i]>1)return false;
return true;
}//判断新加入的行是否会与前面的行冲突
bool dfs(int t)
{
if(pan1())return true;//判断已找到的行是否符合条件
if(t>=m)
{
if(pan1())return true;
else return false;
}//如果找到了最后一行,判断是否符合条件
for(int i=0;i<n;i++)
{
if(map[t][i]==1)vis[i]++;
}//对于当前这一行
if(pan2())
{
if(dfs(t+1))return true;
}//判断加进这一行后是否与前面发生矛盾
for(int i=0;i<n;i++)
{
if(map[t][i]==1)vis[i]--;
}//如果矛盾,则回溯
if(dfs(t+1))return true;
return false;
}
int main()
{
while(cin>>m>>n)
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
scanf("%d",&map[i][j]);
memset(vis,0,sizeof(vis));
if(dfs(0))cout<<"Yes, I found it\n";
else cout<<"It is impossible\n";
}
return 0;
}
注意输入输出,不然会坑爹的超时