方格填数
如图,如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?
请填写表示方案数目的整数。
解法:DFS
#include<stdio.h>
#include<stdlib.h>
int flag[3][4]; //代表是否可以填数
int mpt[3][4]; //代表格子
int visit[10]={0}; //0表示还没用到
int ans=0;
void init(){
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
flag[i][j]=1;
}
}
flag[0][0]=0;
flag[2][3]=0;
}
void solve(){
bool book=true;
int dir[8][2]={1,0,1,1,0,1,-1,1,-1,0,-1,-1,0,-1,1,-1};
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
if(!flag[i][j]){
continue;
}
for(int k=0;k<8;k++){
int x,y;
x=i+dir[k][0];
y=j+dir[k][1];
if(x<0||x>=3||y<0||y>=4||flag[x][y]==0){
continue;
}
if(abs(mpt[x][y]-mpt[i][j])==1){
book=false;
}
}
}
}
if(book){
ans++;
}
}
void dfs(int index){
int x=index/4;
int y=index%4;
if(x==3){
solve();
return;
}
if(flag[x][y]){
for(int i=0;i<10;i++){
if(!visit[i]){
visit[i]=1;
mpt[x][y]=i;
dfs(index+1);
visit[i]=0;
}
}
}else{
dfs(index+1);
}
}
int main(){
init();
dfs(0);
printf("%d\n",ans);
return 0;
}
答案:1580