zoukankan      html  css  js  c++  java
  • ACWing844. 走迷宫

    题目

    分析

    最短路,权值相同,用BFS

    代码

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<queue>
     4 #include<cstring>
     5 using namespace std;
     6 
     7 const int N = 110;
     8 int n ,m;
     9 int g[N][N],d[N][N]; //g表示地图,d表示从(0,0)到(i,j)最短路径距离
    10 typedef pair<int,int>PII; //二维坐标
    11 queue<PII>q;//队列
    12 //定义方向,上下左右(0,1)、(0,-1)、(-1,0)、(1,0)
    13 //int dx[4] = {0,0,-1,1},dy[4] = {1,-1,0,0};
    14 pair<int,int>dd[4] = {{0,1},{0,-1},{-1,0},{1,0}};
    15 
    16 int bfs(){
    17     d[0][0] = 0;
    18     q.push({0,0});
    19     while(!q.empty()){
    20         auto t= q.front();
    21         q.pop();
    22         for(int i = 0;i < 4;i++){
    23             //int x = t.first + dx[i],y = t.second + dy[i];
    24             int x = t.first + dd[i].first,y = t.second + dd[i].second;
    25             if(g[x][y] == 0 && d[x][y] == -1 && x < n && y < m && x >= 0 && y >= 0){
    26                 d[x][y] = d[t.first][t.second] + 1;
    27                 q.push({x,y});
    28             }
    29         }
    30     }
    31     return d[n-1][m-1];
    32 }
    33 
    34 int main(){
    35    cin>>n>>m;
    36    for(int i = 0;i < n;i++){
    37        for(int j = 0;j < m;j++){
    38            cin>>g[i][j]; 
    39        }
    40    }
    41    memset(d,-1,sizeof(d));//从起点到每个位置初始化为-1,表示未访问。
    42    printf("%d",bfs());
    43    return 0;
    44 }

    输出路径

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<queue>
     4 #include<cstring>
     5 using namespace std;
     6 
     7 const int N = 110;
     8 int n ,m;
     9 int g[N][N],d[N][N]; //g表示地图,d表示从(0,0)到(i,j)最短路径距离
    10 typedef pair<int,int>PII; //二维坐标
    11 queue<PII>q;//队列
    12 //定义方向,上下左右(0,1)、(0,-1)、(-1,0)、(1,0)
    13 //int dx[4] = {0,0,-1,1},dy[4] = {1,-1,0,0};
    14 pair<int,int>dd[4] = {{0,1},{0,-1},{-1,0},{1,0}};
    15 
    16 //记录路径
    17 PII pre[N][N];
    18 
    19 int bfs(){
    20     d[0][0] = 0;
    21     q.push({0,0});
    22     while(!q.empty()){
    23         auto t= q.front();
    24         q.pop();
    25         for(int i = 0;i < 4;i++){
    26             //int x = t.first + dx[i],y = t.second + dy[i];
    27             int x = t.first + dd[i].first,y = t.second + dd[i].second;
    28             if(g[x][y] == 0 && d[x][y] == -1 && x < n && y < m && x >= 0 && y >= 0){
    29                 d[x][y] = d[t.first][t.second] + 1;
    30                 q.push({x,y});
    31                 pre[x][y] = t;//记录从哪里转移过来的
    32                 
    33             }
    34         }
    35     }
    36     return d[n-1][m-1];
    37 }
    38 
    39 int main(){
    40    cin>>n>>m;
    41    for(int i = 0;i < n;i++){
    42        for(int j = 0;j < m;j++){
    43            cin>>g[i][j]; 
    44        }
    45    }
    46    memset(d,-1,sizeof(d));//从起点到每个位置初始化为-1,表示未访问。
    47    printf("%d",bfs());
    48    
    49    //逆序打印路径
    50    int x = n-1,y = m-1;
    51    while(x || y){
    52        cout<<x<< " " <<y<<endl;
    53        x = pre[x][y].first, y = pre[x][y].second;
    54        
    55    }
    56    return 0;
    57 }
  • 相关阅读:
    利用GitHub+Node.js+Hexo搭建个人博客(一)
    更丰富的符号工具包 Font Awesome
    Markdwon入门2
    Codechef:Fibonacci Number/FN——求通项+二次剩余+bsgs
    二次剩余理论
    基姆拉尔森公式和蔡勒公式(计算星期几)
    幂方程(模意义下)
    etcd
    mysql group by
    UUID
  • 原文地址:https://www.cnblogs.com/fresh-coder/p/14431103.html
Copyright © 2011-2022 走看看