-
蓝桥杯----玩具蛇 DFS
这是一道蓝桥杯国赛真题,属于典型地DFS算法题。
1.选玩具蛇第一节放置的位置,显然4x4的格子都可以。
2.从玩具蛇第一节出发,调用搜索算法。
3.条件 相邻两节成直线或90° 是为下一节放置的方向只能为相邻的上下左右 四个格子,其中已放过的格子,以及越界时不放置。
#include "iostream"
using namespace std;
int dx[4]={1,0,-1,0}; //方向控制
int dy[4]={0,1,0,-1};
int a[4][4]={0};
int n=0;
int main()
{
void dfs(int stay,int x,int y);
int stay=0; //玩具蛇共16节 已放置了stay节
int i,k;
for(i=0;i<4;i++) //对4x4的格子 枚举玩具蛇第一个步放置的所有可能。
{
for(k=0;k<4;k++)
{
a[i][k]=1; //对已放置的格子进行标记
dfs(1,i,k);
a[i][k]=0; //清除标记
}
}
cout<<n;
return 0;
}
void dfs(int stay,int x,int y) //x,y相当于正在放置的格子的坐标
{
int tx,ty;
if(stay==16) //递归终止条件
{
n++;
return;
}
for(int i=0;i<4;i++) //尝试向四个方向放置
{
tx=x+dx[i]; //方向
ty=y+dy[i];
if(a[tx][ty]==1||tx<0||tx>3||ty<0||ty>3) //该格子不可放置 或越界 跳过该方向
continue;
a[tx][ty]=1; // 对已放置的格子进行标记
dfs(stay+1,tx,ty);
a[tx][ty]=0; //清除标记
}
}