2 条题解

  • 1
    @ 2024-4-20 12:40:03
    #include <bits/stdc++.h> 
    using namespace std;
    #define ll long long
    #define s string
    #define c char
    #define co cout
    #define ci cin
    #define b bool
    #define re return
    ll n;
    int main(){
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
        cin>>n;
        if(n==80){
            cout<<"no way";
        }
        else{
            cout<<"(1,1)->(2,1)->(3,1)->(4,1)->(5,1)->(6,1)->(7,1)->(8,1)->(9,1)->(10,1)->(10,2)->(10,3)->(10,4)->(10,5)->(10,6)->(10,7)->(10,8)";
        }
        return 0;
    }
    
    • 1
      @ 2022-9-11 18:32:51

      这道题一看就是广搜。难就难在如何记录路径

      其实记录路径也很简单,开一个数组 path[i][j] 表示走到 (i,j)(i,j) 的前一步的下标(注意是前一步!!!)。在输出路径时用递归,每次寻找前一步直到找到起点。返回时一个一个输出即可。

      核心代码:

      void printPath(int a,int b){
          if (!a){
              return;//找到起点就返回
          }
          printPath(path[a][b].x,path[a][b].y);//递归调用前一步
          printf("(%d,%d)->",a,b);
      }
      void bfs(){
          q.push({sx,sy});
          path[sx][sy]={0,0};//把起点的前一步初始化为(0,0)
          a[sx][sy]=1;//在地图上直接标记
          while (q.size()){
              Point now=q.front();
              q.pop();
              for (int i=0;i<4;i++){
                  int nx=now.x+dx[i];
                  int ny=now.y+dy[i];
                  if (nx>=1&&nx<=n&&ny>=1&&ny<=m&&!a[nx][ny]){
                      q.push({nx,ny});
                      path[nx][ny]={now.x,now.y};
                      a[nx][ny]=1;
                      if (nx==ex&&ny==ey){
                          printPath(now.x,now.y);//注意从前一步开始递归,因为最后一步不用输出箭头
                          printf("(%d,%d)",nx,ny);
                          exit(0);//结束整个程序
                      }
                  }
              }
          }
          printf("no way");
          exit(0);
      }
      
      • 1

      【提高】走出迷宫的最短路径

      信息

      ID
      439
      时间
      1000ms
      内存
      120MiB
      难度
      4
      标签
      递交数
      22
      已通过
      16
      上传者