方格填数
如下的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