如下的10个格子填入0~9的数字。要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻)一共有多少种可能的填数方案?请填写表示方案数目的整数。注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
答案: (15分)
把格子想成一维
code:
//LQ(5)方格填数 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; int ans = 0; int dir[] = {-1,-5,-4,-3}; int a[11] = {-20}; int isNoHave(int n,int key){ for(int i = 1; i < n; i++){ if(a[i] == key) return 0; } return 1; } int Check(int k){//key int i; if(k == 4 || k == 8){ for(i = 2; i < 4; i++){ if(k + dir[i] >= 1 && abs(a[k] - a[k+dir[i]]) == 1) return 0; } } else if(k == 3 || k == 7){ for(i = 0; i < 3; i++){ if(k + dir[i] >= 1 && abs(a[k] - a[k+dir[i]]) == 1) return 0; } } else{ for(i = 0; i < 4; i++){ if(k + dir[i] >= 1 && abs(a[k] - a[k+dir[i]]) == 1) return 0; } } return 1; } void dfs(int k){ if(k == 11){ ans++; return ; } for(int i = 0; i <= 9; i++){ if(isNoHave(k,i)){ a[k] = i; if(Check(k)){ dfs(k+1); } } } } int main(){ dfs(1); printf("%d",ans); return 0; } //1580