方格填数
如下的10个格子
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
如下的10个格子
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
一开始直接用dfs八个方向进行搜索,结果很大,也不知道问题在哪里
最后直接一个方格一个方格的填,就出现了答案
先说一下思路吧, 对于每一个0-9的数进行标记,对于每一个坐标点进行填数
对填写的数进行判断如果可以直接填写,然后进行下一个dfs
如果不可以进行寻找合适的数字,找不到直接回溯到上一个dfs
答案:1580
#include <cstdio>
#include <cstring>
#include <cmath>
int chess[8][8],sum=0;//sum代表方案的总数
bool vis[20];
int dx[8]={-1,-1,-1,0,0,1,1,1};
int dy[8]={-1,0,1,-1,1,-1,0,1};
bool check(int k,int x,int y)//对他相邻的8个方格进行比较
{
int i,j;
for(i=0;i<8;++i)
{
int ex = x + dx[i];
int ey = y + dy[i];
if(chess[ex][ey]!=-1&&(ex!=1||ey!=1)&&(ex!=3||ey!=4)&&ex>=1&&ex<4&&ey>0&&ey<5)
{
if(abs(chess[ex][ey]-k)==1)
return false;
}
}
return true;
}
void dfs(int sx,int sy)//sx,sy代表初始坐标
{
for(int k=0;k<10;++k)
{
if(!vis[k]&&check(k,sx,sy))
{
if(sx==3&&sy==3)//这个 是终点坐标,最后一个数没有必要进行标记
{ //直接回溯就行了
++sum;
return ;
}
chess[sx][sy]=k;
vis[k]=true;
if(sy==4)//如果到达了,最后一列就进行下一行的填数
dfs(sx+1,1);
else
dfs(sx,sy+1);
vis[k]=false;
chess[sx][sy]=-1;
}
}
}
int main()
{
memset(chess,-1,sizeof(chess));
memset(vis,false,sizeof(vis));
dfs(1,2);//0代表已经填写了多少个数,1,2代表开始的坐标
printf("%d\n",sum);
return 0;
}