• H.迷宫,(算法选修)


    Description

    旅行者和班尼特一起进入了迷宫冒险,但是由于班尼特的不幸体制,迷宫里发生了大火!

    迷宫可以看作是一个二维的地图,范围是n * m (1<=n,m<=50)
    初始时旅行者和班尼特在迷宫的点(x,y)位置上
    迷宫的出口坐标为(ex,ey)
    迷宫的墙的坐标为(ai,bi)
    大火的起源为(fx,fy)
    大火每秒会向周围八个方向扩散(上下左右、左上、右上、左下、右下)
    旅行者和班尼特每秒可以选择一个方向移动一格(上、下、左、右)
    对于任意秒数,旅行者和班尼特先移动,而后大火进行扩散。大火可以烧毁墙壁,旅行者和班尼特不能试图踏入大火所在的区域。
    如果旅行者和班尼特能逃出迷宫,输出最短逃脱时间,如果不能,输出T_T

    Input
    第一行输入一个整数t,表示一共的测试数据组数。
    对于每个测试用例,输入两个整数n,m,表示迷宫的大小。
    接下来是六个整数x,y,ex,ey,fx,fy (1<=x,ex,fx<=n,1<=y,ey,fy<=m)
    接下来一个整数k,表示有k堵墙。(0<=k<=n*m)

    然后是k行整数ai,bi,表是在(ai,bi)的位置上有一堵墙。(1<=ai<=n,1<=bi<=m)

    Output

    t行字符,问题的答案

    末尾有换行

    Sample Input
    2
    5 5
    3 3 4 4 1 1
    1
    3 4
    5 5
    2 4 4 5 1 5
    5
    1 4
    2 3
    2 5
    3 4
    3 5

    Sample Output
    2
    T_T

     

     

    我的思路是开一个数组,存储障碍,再开一个数组用dfs将每一个火扩散到每一个位置的时间记录下来,然后再开一个记录自己时间的数组,然后进行dfs,如果不是障碍,不越界,并且自己的时间小于火到的时间,那么就放进去,如果能到那个位置,就输出,否则输出t—t,但是注意这里有一个特判,不难但是很容易漏掉,如果你到达终点,那么你的时间和火的时间重合也是没问题的 

    1. #include <iostream>
    2. #include <queue>
    3. #include <algorithm>
    4. #include <cstring>
    5. using namespace std;
    6. constexpr int N=35;
    7. int t,n,m,x,y,ex,ey,fx,fy,k,ai,bi;
    8. int za[N][N],huo[N][N],temp1[N][N],sum[N][N],temp3[N][N];
    9. int dx[8]={1,0,0,-1,1,1,-1,-1},dy[8]={0,1,-1,0,1,-1,1,-1};
    10. int bfs1(int x,int y){
    11. queue<pair<int,int >>q;
    12. q.push(make_pair(x,y));
    13. temp1[x][y]=1;
    14. while(!q.empty()){
    15. auto z=q.front();
    16. q.pop();
    17. for(int i=0;i<8;i++ ){
    18. int xx=z.first+dx[i],yy=z.second+dy[i];
    19. if(xx>=1&&y>=1&&xx<=n&&yy<=m&&temp1[xx][yy]==0){
    20. temp1[xx][yy]=1;
    21. huo[xx][yy]=huo[z.first][z.second]+1;
    22. q.push(make_pair(xx,yy));
    23. }
    24. }
    25. }
    26. }
    27. void bfs2(int a1,int b1){
    28. queue<pair<int,int >>que;
    29. que.push(make_pair(a1,b1));
    30. temp3[a1][b1]=1;
    31. while(!que.empty()){
    32. auto w=que.front();
    33. que.pop();
    34. int ans=sum[w.first][w.second]+1;
    35. if(w.first==ex&&w.second==ey){
    36. printf("%d\n",ans-1);
    37. return;
    38. }
    39. for(int i=0;i<4;i++ ){
    40. int aa=w.first+dx[i],bb=w.second+dy[i];
    41. if(aa==ex&&bb==ey&&za[aa][bb]==0&&temp3[aa][bb]==0&&ans<=huo[aa][bb]){
    42. printf("%d\n",ans);
    43. return;
    44. }
    45. if(aa>=1&&bb>=1&&aa<=n&&bb<=m&&za[aa][bb]==0&&temp3[aa][bb]==0&&ans<huo[aa][bb]){
    46. temp3[aa][bb]=1;
    47. que.push(make_pair(aa,bb));
    48. sum[aa][bb]=ans;
    49. }
    50. }
    51. }
    52. printf("T_T\n");
    53. }
    54. int main(){
    55. scanf("%d",&t);
    56. while(t--){
    57. scanf("%d%d",&n,&m);
    58. scanf("%d%d%d%d%d%d",&x,&y,&ex,&ey,&fx,&fy);
    59. scanf("%d",&k);
    60. for(int i=0;i<k;i++){
    61. scanf("%d%d",&ai,&bi);
    62. za[ai][bi]=1;
    63. }
    64. bfs1(fx,fy);
    65. bfs2(x,y);
    66. memset(za,0,sizeof(za));
    67. memset(temp1,0,sizeof(temp1));
    68. memset(temp3,0,sizeof(temp3));
    69. memset(sum,0,sizeof(sum));
    70. memset(huo,0,sizeof(huo));
    71. }
    72. }

     

  • 相关阅读:
    双赢!企业咨询行业和低代码工具的破局之路
    SpringMVC相对路径和绝对路径
    java计算机毕业设计springboot+vue南天在线求助系统
    win32-注册表-32位-64位-读写值-Qt-C++
    HBase-12-HBase容灾策略
    用map函数让你的python起飞
    第 112 场 LeetCode 双周赛题解
    Spark初学者出师未接身先死
    2022杭电多校3(总结+补题)
    枚举类Enum
  • 原文地址:https://blog.csdn.net/q619718/article/details/127717482