zoj 1008 暴力枚举求解dfs+优化

/*
现将相同的合并计数。
再枚举判断是否符合当cou==n*n是符合就退出
*/
#include<stdio.h>
#include<string.h>
#define  N  900
int en[N][4],num[N],real[N][4],len,n,ok;
void pp(int a[4],int b[4])//赋值
{
    a[0]=b[0];
    a[1]=b[1];
    a[2]=b[2];
    a[3]=b[3];
}
void print(int a[4]) {
printf("%d %d %d %d
",a[0],a[1],a[2],a[3]);
}
void dfs(int cou)
{
   // printf("%d
",cou);
 //   if(cou)
    //   print(en[cou]);
    if(cou==n*n) {
     ok=1;
        return ;
    }
    if(ok)return ;
    int i;
    for(i=0;i<len; i++)
    {
        if(num[i]==0)continue;
        if((cou%n==0||en[cou][1]==real[i][3])&&(cou/n==0||en[cou+1-n][2]==real[i][0])) {//注意判断条件对于优化程序很好
            pp(en[cou+1],real[i]);
            num[i]-=1;
            dfs(cou+1);
            num[i]+=1;
        }
    }
    return ;
}
int main()
{
    int i,k=0,w=0,a,b,c,j,d;
    while(scanf("%d",&n),n)
    {
        ok=0;
        memset(num,0,sizeof(num));
        len=0;
        for(i=1; i<=n*n; i++) {
            scanf("%d%d%d%d",&a,&b,&c,&d);
            for(j=0;j<len;j++)
                if(a==real[j][0]&&b==real[j][1]&&c==real[j][2]&&d==real[j][3])
                break;
                if(j<len)
                    num[j]++;
            if(j==len) {
            real[len][0]=a;real[len][1]=b;
            real[len][2]=c;real[len][3]=d;
            num[len++]=1;
            }
        }//这里需要这样储存相同的,感觉有点坑啊 ,原来我的是先储存下来在合并合同的但是chaoshi,改成这样就不超时ile
   
    if(w)
        printf("
");
       dfs(0);
       if(ok)
            printf("Game %d: Possible
",++k);
        else
            printf("Game %d: Impossible
",++k);
    w=1;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410622.html