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