方格填数
如下的10个格子
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
解题方法:dfs
#include <iostream>
using namespace std;
int map[3][4];//初始数组
bool vis[10];//数字i是否已经使用
int dir [8][2]={{-1,0},{1,0},{0,-1},{0,1},{1,1},{-1,-1},{-1,1},{1,-1}};//八个方位
int cnt=0;//可能数
bool in(int x,int y,int k)
{
for (int i=0;i<8;i++)
{
int dx=x+dir[i][0];
int dy=y+dir [i][1];
if(dx>=0&&dx<=2&&dy>=0&&dy<=3)//是否越界
{
if (map[dx][dy]==k+1||map[dx][dy]==k-1)
{
return true;
}
}
}
return false;
}
void dfs (int x,int y)
{
if (y==4)
{
dfs (x+1,0);
return ;
}
if(x==0&&y==0)
{
dfs (x,y+1);
return;
}
if (x==2&&y==3)//搜到这里时就已经成功了
{
cnt++;
return ;
}
for (int i=0;i<10;i++)
{
if (!vis[i]&&!in(x,y,i))
{
vis[i]=true;
map[x][y]=i;
dfs (x,y+1);
vis[i]=false;
map[x][y]=-2;
}
}
}
int main ()
{
for (int i=0;i<3;i++)
{
for (int j=0;j<4;j++)
{
map[i][j]=-2;
}
}
dfs (0,0);
cout<<cnt<<endl;
return 0;
}
详解欢迎关注我的公众号:王同学的蓝桥杯训练营