蓝桥杯刷题——跳跃(深度优先搜索)

162 阅读2分钟

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

这是蓝桥杯21年的一道模拟赛,可以说是一道朴实无华的深度优先搜索题目,没有用一些干扰判断的手段,当然这道题也是可以用动态规划来做的,这里只讲用深度优先搜索来解。

题目

image.png

image.png

思路

我们可以将这道题想象成是走迷宫,地图已经画好了,起点和终点也已经给出,然后每次走都只能按给定的9种方法来走,每走一次到达那个地点时有一次得分,最后到达终点时,要求我们的走法要得分最高。我们就直接用dfs来解决这道题,首先地图用一个二维数组表示,然后再用另外一个二维数组表示这个地点我们是否走过。然后需要一个函数来判断我们是否出界了。然后我们就可以开始设计dfs算法了,算法的开头肯定是加上当前走的点的值,然后判断这个点是否是终点,如果是终点就可以与之前到终点的最大值进行判断,谁大便取谁,然后return即可。再往下是我们的八种走法,每一次的走法都要判断这个要走的点是否走过和是否出界,然后在标记函数中标记已走过,再进行下一轮递归,在下一轮递归完成之后还是讲刚标记过的点标为未走,整个算法就已构造完成了。

代码

#include <bits/stdc++.h>
using namespace std;
int n,m;
int cnt;
int tu[100][100];
int vis[100][100];
bool judge(int x,int y){
  if(x>n||y>m)
  return false;
  else
  return true;
}
int max(int x,int y){
  if(x<y)
  return y;
  else 
  return x;
}
int dir[9][2]={{0,1},{0,2},{0,3},{1,0},{1,1},{1,2},{2,0},{2,1},{3,0}};
void dfs(int x,int y,int snt){
  if(x==n&&y==m)
  {
    snt+=tu[x][y];
    cnt=max(snt,cnt);
    return;
  }
  snt+=tu[x][y];
  for(int i=0;i<9;i++){
    if(judge(dir[i][0]+x,dir[i][1]+y)&&!vis[dir[i][0]+x][dir[i][1]+y])
    {
      vis[dir[i][0]+x][dir[i][1]+y]=1;
      dfs(dir[i][0]+x,dir[i][1]+y,snt);
      vis[dir[i][0]+x][dir[i][1]+y]=0;
    }
  }
  return;
}
int main()
{
  cin>>n>>m;
  for(int i=1;i<=n;i++){
    for(int j=1;j<=m;j++){
      cin>>tu[i][j];
    }
  }
  memset(vis,0,sizeof(vis));
  dfs(1,1,0);
  cout<<cnt;
  return 0;
}