第七届蓝桥杯 方格填数

转载请注明出处: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,感谢!

 

 

posted @ 2018-01-26 14:46  nefuer  阅读(429)  评论(0编辑  收藏  举报