蓝桥杯刷题——玩具蛇(深度优先搜索)

225 阅读2分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。

这是蓝桥杯20年省赛的一道填空题,主要运用了深度优先搜索算法,在蓝桥杯中算是简单题目稍难一些的题目,深度优先搜索算法一定要掌握。

题目

image.png

思路

很显然的,这道题我们可以使用深度优先搜索去做,首先是确定玩具蛇头的位子,也就是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;
}