• 牛客 NC208246 胖胖的牛牛


    题目描述

    每逢佳节胖三斤,牛牛在过去的节日里长胖了,连拐弯都困难,甚至会卡在门上,所以他很讨厌拐弯。给你一个N*N(2≤N≤100)的方格中,‘x’表示障碍,‘.’表示没有障碍(可以走),牛牛可以从一个格子走到他相邻的四个格子,但是不能走出这些格子。问牛牛从A点到B点最少需要转90度的弯几次。

    输入描述:

     
     

    第一行一个整数:N,下面N 行,每行N 个字符,只出现字符:‘.’,‘x’,‘A’,‘B’;表示上面所说的矩阵格子,每个字符后有一个空格。

    输出描述:

    一个整数:最少转弯次数。如果不能到达,输出-1。

    示例1

    输入

    复制

    3
    . x A
    . . .
    B x .

    输出

    复制

    2

    备注:

     
     

    开始和结束时的方向任意。

    思路:要求最小的转向次数,可以用深度优先搜索加优先队列,队列按照转向次数从小到大排序,每次入队当前点坐标和前驱点坐标以及到当前点的转向次数,在出队时将相关点标记不再搜索,第一次遍历到终点的转向次数即是答案;

            因为只要存在转向那么下一点的x和y坐标必与前驱点的x和y坐标不同,于是我们可以利用前驱点坐标来判断是否转向;

    AC代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. const int N=110;
    7. char mp[N][N];
    8. int n,m,sx,sy,ex,ey;
    9. bool st[N][N];
    10. int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
    11. struct Node
    12. {
    13. int x,y,px,py;
    14. int cnt;
    15. bool operator<(const Node&t)const
    16. {
    17. return cnt>t.cnt;
    18. }
    19. };
    20. int bfs()
    21. {
    22. priority_queue q;
    23. q.push({sx,sy,sx,sy,0});
    24. st[sx][sy]=1;
    25. while(q.size())
    26. {
    27. Node t=q.top();
    28. q.pop();
    29. int x=t.x,y=t.y;
    30. if(x==ex&&y==ey)return t.cnt;
    31. st[x][y]=1;
    32. for(int i=0;i<4;i++)
    33. {
    34. int xx=x+dx[i],yy=y+dy[i];
    35. if(xx<0||xx>n-1||yy<0||yy>n-1)
    36. continue;
    37. if(mp[xx][yy]=='x'||st[xx][yy])
    38. continue;
    39. int isTurn=(t.px!=xx&&t.py!=yy);
    40. q.push({xx,yy,x,y,t.cnt+isTurn});
    41. }
    42. }
    43. return -1;
    44. }
    45. int main()
    46. {
    47. cin>>n;
    48. for(int i=0;i
    49. for(int j=0;j
    50. {
    51. cin>>mp[i][j];
    52. if(mp[i][j]=='A')
    53. sx=i,sy=j;
    54. if(mp[i][j]=='B')
    55. ex=i,ey=j;
    56. }
    57. cout<<bfs()<
    58. }

    思路:要求最小的转向次数,可以用深度优先搜索加优先队列,队列按照转向次数从小到大排序,每次入队当前点坐标和前驱点坐标以及到当前点的转向次数,在出队时将相关点标记不再搜索,第一次遍历到终点的转向次数即是答案;

            因为只要存在转向那么下一点的x和y坐标必与前驱点的x和y坐标不同,于是我们可以利用前驱点坐标来判断是否转向;

    思路:要求最小的转向次数,可以用深度优先搜索加优先队列,队列按照转向次数从小到大排序,每次入队当前点坐标和前驱点坐标以及到当前点的转向次数,在出队时将相关点标记不再搜索,第一次遍历到终点的转向次数即是答案;

            因为只要存在转向那么下一点的x和y坐标必与前驱点的x和y坐标不同,于是我们可以利用前驱点坐标来判断是否转向;

    思路:要求最小的转向次数,可以用深度优先搜索加优先队列,队列按照转向次数从小到大排序,每次入队当前点坐标和前驱点坐标以及到当前点的转向次数,在出队时将相关点标记不再搜索,第一次遍历到终点的转向次数即是答案;

            因为只要存在转向那么下一点的x和y坐标必与前驱点的x和y坐标不同,于是我们可以利用前驱点坐标来判断是否转向;

  • 相关阅读:
    Apache APISIX遇到504超时的解决办法
    cmake+OpenCV4.8.0+contrib4.8.0+cuda 12.2编译踩坑
    Flutter系列文章-Flutter基础
    六、python Django REST framework GET参数处理[过滤、排序、分页]
    [计算机提升] 用户和用户组
    WPF入门教程系列二十五——DataGrid使用示例(2)
    Linux——程序地址空间
    9.1.3 定点数类型
    记录一次Java笔试题记录一次Java笔试题
    前端之jQuery
  • 原文地址:https://blog.csdn.net/qq_62242287/article/details/126683626