zoukankan      html  css  js  c++  java
  • 方格填数 (暴力dfs)

    如图,如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。
    (左右、上下、对角都算相邻)一共有多少种可能的填数方案?
    请填写表示方案数目的整数。

    #include <iostream>
    #include <cmath>
    using namespace std;
    int s[5][6];      //数组开大一圈,比较的时候方便 
    int book[10];  //记录数字 是否用过 
    int sum=0;
    void  dfs(int a,int b) //a代表行 b代表列 
    {    
        if(a==3&&b==4)
        {
            for(int i=1;i<=3;i++)
                 for(int j=1;j<=4;j++)
                 {
                      if( abs(s[i][j]-s[i][j-1])==1
                        ||abs(s[i][j]-s[i-1][j-1])==1
                        ||abs(s[i][j]-s[i][j+1])==1
                        ||abs(s[i][j]-s[i+1][j])==1
                        ||abs(s[i][j]-s[i+1][j+1])==1
                        ||abs(s[i][j]-s[i+1][j-1])==1
                        ||abs(s[i][j]-s[i-1][j+1])==1
                        ||abs(s[i][j]-s[i-1][j])==1
                      )   //这里的比较是直接和周围的八个相邻的数比较,不用担心数组越界,因为上边我把数组开大了一圈 
                        return ; 
                 }
            sum++;
            return ; 
        }
        for(int k=0;k<=9;k++) 
        {
            if(book[k]==0)
            {
                s[a][b]=k; //把数字放入 
                book[k]=1; //记录已经用过这个数字 
                if(b==4)   //当b==4的时候换行 
                   dfs(a+1,1); 
                else 
                    dfs(a,b+1);
                book[k]=0; //回溯 
            }
        }
        return ;
    }
    int main()
    {
        for(int i=0;i<5;i++)
            for(int j=0;j<6;j++)
                s[i][j]=-999;     //赋初始值 
        for(int i=0;i<10;i++)
            book[i]=0;              //赋初始值 
        dfs(1,2);                 //因为开大了一圈,所以从(1,2)开始 
        cout<<sum;
        return 0;
    }
  • 相关阅读:
    对字符串做预处理 、 工具类
    判断对象是否为空 、 工具类
    判断集合是否为空 、 工具类
    jquery取值
    时间年月日格式化
    图片上传
    验证码解决方案
    PHP高效率写法
    关于ip判断
    composer(管理依赖关系的工具) 及配置信息
  • 原文地址:https://www.cnblogs.com/seamusopen/p/8639646.html
Copyright © 2011-2022 走看看