您的位置:首页 > 其它

poj 3740 Easy Finding

2011-07-22 16:51 155 查看
#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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: