zoukankan      html  css  js  c++  java
  • 【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);
    }
  • 相关阅读:
    No.1
    JS二叉树的操作
    JS实现快排
    BOM中的各种height
    innerHTML outerHTML innerText value 区别
    【转载】JS中DOM操作汇总
    【转载】轻松理解JS闭包
    【转载】JavaScript模块入门
    【转载】JavaScript模块简介
    【转载】浏览器缓存详解:expires cache-control last-modified
  • 原文地址:https://www.cnblogs.com/victorique/p/8427061.html
Copyright © 2011-2022 走看看