浏览器标题切换
浏览器标题切换end

蓝桥杯2016初赛 - 方格填数 - 暴力/DFS

这个是直接暴力写的,但是我想到暴力,但是看了这个博主写的我觉得我肯定会有细节漏掉
https://blog.csdn.net/u014552756/article/details/50946108?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.channel_param

思路

DFS。答案是1580。

代码

这个链接下的暴力方法不超时。
https://blog.csdn.net/u014552756/article/details/50946108

(我这个代码超时,但是运行出来的答案是正确的,直接答案提交就行)

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f

int a[5][5]; // 可以填进去数的地方
int num[5][5]; //填上数
int ans; // 几种填法
bool book[25];
int to[8][2]= {{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0}};

void dfs(int id)
{
    int x=id/4,y=id%4;
    if(x==3)
    {
        bool flag=0;
        for(int i=0; i<3; i++)
        {
            for(int j=0; j<4; j++)
            {
                if(a[i][j]==0) // 判断四周有没有方格
                    continue;
                for(int k=0; k<8; k++) // 八方向
                {
//                    int tx=x+to[k][0];
//                    int ty=y+to[k][1];
                    int tx=i+to[k][0];
                    int ty=j+to[k][1];
                    if(tx>=0&&tx<3&&ty>=0&&ty<4&&a[tx][ty])
                    {
                        if(abs(num[tx][ty]-num[i][j])==1)
                            flag=1;
                    }
                }
            }
        }
        if(!flag) ans++;
        return ;
    }
    if(!a[x][y])
        dfs(id+1);
    else
    {
        for(int i=0; i<=9; i++) // 遍历九个数字
        {
            if(!book[i])
            {
                book[i]=1;
                num[x][y]=i;
                dfs(id+1);
                book[i]=0;
            }
        }
    }
}

int main()
{
//    cout<<1580<<endl; 数字不重复
    ios::sync_with_stdio(false);
    ans=0;
    for(int i=0; i<3; i++)
    {
        for(int j=0; j<4; j++)
            a[i][j]=1;
    }
    a[0][0]=0,a[2][3]=0;
    dfs(0);
    cout<<ans<<endl;
    return 0;
}
posted @ 2020-10-13 14:13  抓水母的派大星  阅读(101)  评论(0编辑  收藏  举报