【P1274】魔术数字游戏(搜索+剪枝+模拟)

做完了这个题的我一口老血喷在屏幕上。。。

这个题难度不高(~~胡扯~~),就是爆搜就可以了,然而。。判断条件灰常多,剪枝也就非常多。。然而,这些判断条件又不得不必须满足,所以也就十分容易错。。。

说一下我都是怎么错的吧。。。

##1:眼瘸少看到一个条件。。。

##2:犯傻以为不加这个地方的数字是否用过的条件也行,结果卡掉。。。

##3:输出完一个结果之后不打return。。。

##4:只是判断了数字1是不是用过忘了要接着return防止覆盖。。。

##5:用已经填上的数字个数而不是位置作为判断条件。。。

好了,错点也不能太多了(要不我也改不对。。。),作为新年的第一道题,这个题也还是挺正(du)常(liu)的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define re register
#define maxn 1000007
#define ll long long
using namespace std;
int a[101],b[101],vis[101],d,x,n,m,t,s,sum,ans[101];
inline void dfs(int num,int t)
{
    if(a[t])
    {
        dfs(num+1,t+1);
        return;
    }
    if(t>4)
    {
        if(a[1]+a[2]+a[3]+a[4]!=34&&a[1]&&a[2]&&a[3]&&a[4])
        return;
        if(t>6)
        {
            if(a[1]+a[2]+a[5]+a[6]!=34&&a[1]&&a[2]&&a[5]&&a[6])
            return;
            if(t>8)
            {
                if(a[5]+a[6]+a[7]+a[8]!=34&&a[5]&&a[6]&&a[7]&&a[8])
                return;
                if(a[3]+a[4]+a[7]+a[8]!=34&&a[3]&&a[4]&&a[7]&&a[8])
                return;
                if(t>11)
                {
                    if(a[6]+a[7]+a[10]+a[11]!=34&&a[6]&&a[7]&&a[10]&&a[11])
                    return;
                    if(num>12)
                    {
                        if(a[9]+a[10]+a[11]+a[12]!=34&&a[9]&&a[10]&&a[11]&&a[12])
                        return;
                        if(t>13)
                        {
                            if(a[13]+a[10]+a[7]+a[4]!=34&&a[13]&&a[10]&&a[7]&&a[4])
                            return;
                            if(a[1]+a[5]+a[9]+a[13]!=34&&a[1]&&a[5]&&a[9]&&a[13])
                            return;
                            if(t>14)
                            {
                                if(a[9]+a[10]+a[13]+a[14]!=34&&a[9]&&a[10]&&a[13]&&a[14])
                                return;
                                if(a[2]+a[6]+a[10]+a[14]!=34&&a[2]&&a[6]&&a[10]&&a[14])
                                return;
                                if(t>15)
                                {
                                    if(a[3]+a[7]+a[11]+a[15]!=34&&a[3]&&a[7]&&a[11]&&a[15])
                                    return;
                                    if(t==17)
                                    {
                                        if(a[13]+a[14]+a[15]+a[16]!=34&&a[13]&&a[14]&&a[15]&&a[16])
                                        return;
                                        if(a[11]+a[12]+a[15]+a[16]!=34&&a[11]&&a[12]&&a[15]&&a[16])
                                        return;
                                        if(a[1]+a[6]+a[11]+a[16]!=34&&a[1]&&a[6]&&a[11]&&a[16])
                                        return;
                                        if(a[1]+a[4]+a[13]+a[16]!=34&&a[1]&&a[4]&&a[13]&&a[16])
                                        return;
                                        if(a[4]+a[8]+a[12]+a[16]!=34&&a[4]&&a[8]&&a[12]&&a[16])
                                        return;
                                        for(re int i=1;i<=16;i++)
                                        {
                                            cout<<a[i]<<" ";
                                            if(i%4==0)
                                            cout<<endl;
                                        }    
                                        cout<<endl;
                                        return;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    for(re int i=2;i<=16;i++)
    {
        if(!b[i])
        {
            b[i]=1;
            a[t]=i;
            dfs(num+1,t+1);
            b[i]=0;
            a[t]=0;
        }
    }
}
int main()
{
    cin>>s>>t;
    a[(s-1)*4+t]=1;
    dfs(0,1);
}

 

posted @ 2018-02-07 15:54  ~victorique~  阅读(249)  评论(0编辑  收藏  举报
Live2D