如图,如下的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; }