方格填数 (暴力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;
}

 

posted @ 2018-03-24 16:32  uzi2008  阅读(245)  评论(0编辑  收藏  举报