第六题:
方格填数
如下的10个格子
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
方格填数
如下的10个格子
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
代码:
#include<cstdio>
#include<algorithm>
int sum=0;
int visit[10],flag[3][4],mp[3][4]={0};
int tx[4]={-1,-1,-1,0};
int ty[4]={-1,0,1,-1};
void init()///可以任意修改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;
return ;
}
int test(int a,int b)///判断是否可行
{
int ti,tj;
for(int i=0;i<4;i++)///因为是由左->右,由上->下,所以只要判断4个方向
{
ti=a+tx[i],tj=b+ty[i];
if(ti>=0&&tj>=0&&ti<=2&&tj<=3&&flag[ti][tj]==1)///如果方向上的flag=0,即不用判断
{
if(abs(mp[ti][tj]-mp[a][b])==1)
return 0;
}
}
return 1;
}
void dfs(int x,int y)
{
if(x==2&&y==3)
{
sum++;
return ;
}
if(flag[x][y])
{
for(int i=0;i<10;i++)
if(!visit[i])///判断是否用过
{
visit[i]=1;
mp[x][y]=i;
if(test(x,y))
{
if(y==3)///判断是否需要换行
dfs(x+1,0);
else dfs(x,y+1);
}
visit[i]=0;
}
}
else{
if(y==3)
dfs(x+1,y);
else dfs(x,y+1);
}
}
int main()
{
init();///初始化图
dfs(0,0);
printf("%d\n",sum);
return 0;
}