POJ3740

来源:互联网 发布:python八数码算法 编辑:程序博客网 时间:2024/06/05 05:31

#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)returnfalse;
   return true;
}//判断是否某一列完全没有1
bool pan2()
{
    for(int i=0;i<n;i++)
    if(vis[i]>1)returnfalse;
    return true;
}//判断新加入的行是否会与前面的行冲突
bool dfs(int t)
{
   if(pan1())returntrue;//判断已找到的行是否符合条件
   if(t>=m)
   {
       if(pan1())returntrue;
       else returnfalse;
   }//如果找到了最后一行,判断是否符合条件
   for(int i=0;i<n;i++)
   {
       if(map[t][i]==1)vis[i]++;
   }//对于当前这一行
   if(pan2())
   {
       if(dfs(t+1))returntrue;
   }//判断加进这一行后是否与前面发生矛盾
   for(int i=0;i<n;i++)
   {
       if(map[t][i]==1)vis[i]--;
   }//如果矛盾,则回溯
   if(dfs(t+1))returntrue;
   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;
}

注意输入输出,不然会坑爹的超时

0 0
原创粉丝点击