转载请注明出处:http://www.cnblogs.com/zhishoumuguinian/p/8359473.html
方格填数
如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻)一共有多少种可能的填数方案?请填写表示方案数目的整数。注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

1 #include <math.h>
2 #include <iostream>
3 using namespace std;
4
5 int ans = 0, flag[10] = {0};//flag数组标志数字是否已经填在方格中
6
7
8 int Check(int a[][4], int x, int y)//检查填在位置上的数组是否和法,不合法返回0,
9 {
10 if(x!=0)//如果不是第一行,那么就检查他上方的数
11 {
12 if(fabs(a[x][y]-a[x-1][y])==1) return 0;
13 }
14 if(y!=0)//如果不是第一列,检查前一个数。
15 {
16 if(fabs(a[x][y]-a[x][y-1])==1) return 0;
17 }
18 if(x>0&&y<3)//如果不是第一行,并且不是最后一列,检查右上方
19 {
20 if(fabs(a[x][y]-a[x-1][y+1])==1) return 0;
21 }
22 if(x>0&&y>0)//如果不是第一行,并且不是第一列,检查左上方
23 {
24 if(fabs(a[x][y]-a[x-1][y-1])==1) return 0;
25 }
26 //在这说明,我们不需要检查这个数后边的所有数,因为后边的数还没填。以上都没有不合法,说明这个数可以填在这个位置,返回1
27 return 1;
28 }
29
30 void dfs(int a[][4], int x, int y)
31 {
32 if(2 == x && 3 == y){//递归结束条件,此时,方格已经填满,是一种可行的方案,ans++
33 ans++;
34 return ;
35 }
36 for(int num = 0; num <= 9; num ++)
37 if(!flag[num]){//如果num不在方格中
38 a[x][y] = num;//将其填入到方格中
39 flag[num] = 1;
40 if(Check(a, x, y)){//判断num填在a[x][y]和法不,如果和法,就找下一个方格填什么数
41 if(y + 1 < 4)
42 dfs(a, x, y + 1);
43 else
44 dfs(a, x + 1, 0);
45 }
46 flag[num] = 0;//num填在a[x][y]不合法,或者已经回退了,我们需要将num从方格中拿出来。
47 }
48 }
49
50
51 int main()
52 {
53 int a[3][4] = {-2};//把a[0][0]赋值一个与0-9都不相邻的数,方便检查时候检查条件判断。
54 dfs(a, 0, 1);//从a[0][1]开始填入数字。
55 cout<<ans;
56 return 0;
57 }
如果帮到你,麻烦给个👍,谢谢啦。。。。。
思路来自于:http://blog.csdn.net/luoluozlb/article/details/51339264,感谢!
来源:https://www.cnblogs.com/zhishoumuguinian/p/8359473.html