#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const int N=20;
int col[310];//col[i] 第i列的和
int a[N][310];
bool flag;
int m,n;
bool check()
{
for(int j=1;j<=n;j++)
if(col[j]>1)
return false;
return true;
}
void dfs(int cur)
{
if(!check())//矛盾了
{
return;
}
if(cur==m+1||flag)
{
int cnt=0;
for(int j=1;j<=n;j++)
{
if(col[j]==1)
cnt++;
}
if(cnt==n)
flag=true;
return;
}
for(int j=1;j<=n;j++)
{
col[j]+=a[cur][j];
}
dfs(cur+1);//选
for(int j=1;j<=n;j++)
{
col[j]-=a[cur][j];/回溯
}
dfs(cur+1);//不选
}
int main()
{
while(cin>>m>>n)
{
flag=false;
//找到some rows that let every cloumn contains and only contains 1
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
}
}
dfs(1);//从第一行开始
if(flag)
cout<<"Yes, I found it"<<endl;
else
cout<<"It is impossible"<<endl;
}
return 0;
}
poj 3740 dfs回溯
最新推荐文章于 2019-07-11 12:42:27 发布