「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。
这是蓝桥杯20年省赛的一道填空题,主要运用了深度优先搜索算法,在蓝桥杯中算是简单题目稍难一些的题目,深度优先搜索算法一定要掌握。
题目
思路
很显然的,这道题我们可以使用深度优先搜索去做,首先是确定玩具蛇头的位子,也就是1的位子,然后从1的位子开始,进行深度优先搜索,每走一步,那一步的位子就是玩具蛇2的位子,一共走16次,能不能走的判断方式是是否会出盒子边界,如果在盒子内走了16步,那就一定铺满了整个盒子,这就是一种放法,而且深度优先搜索不会出现重复的情况,所以这样走出的每一个放法都是独一无二的。那么如何确定玩具蛇头的位子?就是分别从盒子的16个位子开始,一共进行16次的深度优先搜索。深度优先搜索算法的设计就是传统的算法设计,按照模板来就可以。但是要加一个计数器,每次在盒子中走出下一步的时候计数器加一,计数器到16的时候就可以放法加一退出搜索了。最后输出总方法即可。
总代码
#include <bits/stdc++.h>
using namespace std;
int ans=0;
int vis[10][10]={0};
int turn[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void dfs(int i,int j,int ant){//下一步的坐标以及计数器
if(ant==16){
ans++;
return;
}
for(int m=0;m<4;m++){
if(vis[i+turn[m][0]][j+turn[m][1]]==0&&i+turn[m][0]>=1&&j+turn[m][1]>=1&&i+turn[m][0]<=4&&j+turn[m][1]<=4)//如果出边界就不要走了,减少运算量
{
vis[i+turn[m][0]][j+turn[m][1]]=1;//标记已走
dfs(i+turn[m][0],j+turn[m][1],ant+1);
vis[i+turn[m][0]][j+turn[m][1]]=0;//恢复原状态
}
}
return;
}
int main()
{
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
vis[i][j]=1;
dfs(i,j,1);
vis[i][j]=0;
}
}
cout<<ans;
return 0;
}