POJ 3740 Easy Finding

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int R=20;
const int C=305;
int A[R][C];
int n,m;
int ff[R][R];
int flag;
int U[R];
int cnt;
int sum[C];

void DFS(int tot,int x,int now)
{
    int ii,i,j;
    int fail=0;
    if(x==tot)
    {
        if(cnt==m)flag=1;
        return;
    }
    if(now>n) return;
    for(i=0;i<x;i++)
        if(ff[U[i]][now]==1)
            fail=1;
    if(fail==0)
    {
        U[x]=now;
        cnt=cnt+sum[now];
        DFS(tot,x+1,now+1);
        cnt=cnt-sum[now];
        if(flag) return;
    }

    DFS(tot,x,now+1);
    if(flag) return;
}
int main()
{
    int i,j,k;
    while(~scanf("%d%d",&n,&m))
    {
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                scanf("%d",&A[i][j]);
        memset(ff,0,sizeof(ff));
        memset(sum,0,sizeof(sum));
        for(i=1;i<=n;i++)
            for(j=i+1;j<=n;j++)
                for(k=1;k<=m;k++)
                    if(A[i][k]==1&&A[j][k]==1)
                    {
                        ff[i][j]=1;
                        ff[j][i]=1;
                        break;
                    }
        flag=0;
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                if(A[i][j]==1)
                    sum[i]++;
        cnt=0;
        for(i=1;i<=n;i++)
        {
            DFS(i,0,1);
            if(flag) break;
        }
        if(flag) printf("Yes, I found it
");
        else printf("It is impossible
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/4658379.html