题目:
方格填数
如下的10个格子
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
代码:
#include <iostream> using namespace std; int mapp[3][4],book[10],ans=0; int abs(int c) { return c>=0? c:-c; } bool check(int l,int r,int key) { if( l == 0 && r == 0 ) return true; else if( l == 0 )//第一行时只需要判断右边 差值大于1 return abs(key-mapp[l][r-1]) > 1; else if( r == 0 )//第一列 上 右上 差值大于1 return abs(key-mapp[l-1][r]) > 1 && abs(key-mapp[l-1][r+1])>1; else if( r != 3 ) return abs(key-mapp[l][r-1]) > 1 && abs(key-mapp[l-1][r]) > 1 && abs(key-mapp[l-1][r-1])>1 && abs(key-mapp[l-1][r+1])>1; else //第二行四列 三行四列 上 左 左上 差值大于1 return abs(key-mapp[l][r-1]) > 1 && abs(key-mapp[l-1][r]) > 1 && abs(key-mapp[l-1][r-1])>1; } void dfs(int l,int r) { if(l==2&&r==3){ ans++; return ; } for(int i=0;i<10;i++){ if(book[i]==0&&check(l,r,i)){ book[i]=1; mapp[l][r]=i; dfs(l+(r+1)/4,(r+1)%4); book[i]=0; } } } int main() { mapp[0][0]=100,mapp[2][3]=100; for(int i=0;i<10;i++){ book[i]=0; } dfs(0,1); cout<<ans<<endl; return 0; }
转载请标明出处:蓝桥c格子填数
文章来源: https://blog.csdn.net/zi_mingyue/article/details/88085148