poj 3740 Easy Finding

#include<iostream>            //按列dfs暴搜    
using namespace std;
int m,n,table[18][305],visited[18],tag[305],num;
void dfs(int start)
{
int i,j,over;
if(tag[start]==1)
dfs(start
+1);
else
for(i=0;i<m;++i)
{
if(visited[i]==1||table[i][start]==0)
continue;
over
=0;
for(j=0;!over&&j<n;++j)
if(table[i][j]+tag[j]>1)
over
=1;
if(over==1)
continue;
for(j=start;j<n;++j)
if(table[i][j]==1)
tag[j]
=1,num++;
visited[i]
=1;
if(num==n)
return;
dfs(start
+1);
if(num==n)
return;
for(j=start;j<n;++j)
if(table[i][j]==1)
tag[j]
=0,num--;
visited[i]
=0;
}
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
for(int i=0;i<m;++i)
for(int j=0;j<n;++j)
scanf(
"%d",&table[i][j]);
memset(tag,
0,sizeof(tag));
memset(visited,
0,sizeof(visited));
num
=0;
dfs(
0);
if(n&&num==n) //保证n不为0
printf("Yes, I found it\n");
else
printf(
"It is impossible\n");
}
return 0;
}

  

posted on 2011-07-22 16:51  sysu_mjc  阅读(120)  评论(0编辑  收藏  举报

导航