• CSU 1259 bfs找最短路


    题目大意:

    不想介绍,题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1259

    bfs求最短路。

    这里因为2-9,到达同样的点不计步数,那我们不能每次bfs都遍历一个图找到所有相同的点,所以这里用vector[10],保存对应的2-9的相同的节点

    题目本身比较简单,只是考虑的东西有点多,慢慢写就行了

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <iostream>
      4 #include <vector>
      5 #include <queue>
      6 using namespace std;
      7 #define N 105
      8 int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
      9 int dp[N][N],n,visit[N][N];
     10 int mat[N][N];
     11 struct Node{
     12     int x,y;
     13     Node(int x=0,int y=0):x(x),y(y){}
     14     bool operator==(const Node &m)const{
     15         return x == m.x && y == m.y;
     16     }
     17 };
     18 Node st , la;
     19 vector<Node> G[10];
     20 queue<Node> q;
     21 
     22 bool ok(int x,int y){
     23     if(x>=1 && x<=n && y>=1 && y<=n && mat[x][y] != 1)
     24         return true;
     25     return false;
     26 }
     27 
     28 void bfs()
     29 {
     30     q.push(st);
     31     visit[st.x][st.y] = 1;
     32     dp[st.x][st.y] = 0;
     33     while(!q.empty()){
     34         Node u = q.front();
     35        //cout<<"test: "<<u.x<<"  "<<u.y<<"  "<<dp[x][y]<<endl;
     36         q.pop();
     37         if(u == la) continue;
     38         if(mat[u.x][u.y] == 0){
     39             for(int i=0;i<4;i++){
     40                 int xx = u.x+dir[i][0];
     41                 int yy = u.y+dir[i][1];
     42                 if(ok(xx,yy)){
     43                     if(dp[xx][yy] > dp[u.x][u.y] + 1){
     44                         dp[xx][yy] = dp[u.x][u.y] + 1;
     45                         if(!visit[xx][yy]){
     46                             visit[xx][yy]=1;
     47                             q.push(Node(xx,yy));
     48                         }
     49                     }
     50                 }
     51             }
     52         }
     53         else{
     54             int t = mat[u.x][u.y];
     55             for(int i=0;i<(int)G[t].size();i++){
     56                 Node m = G[t][i];
     57                 if(m == u) continue;
     58                 if(dp[m.x][m.y] > dp[u.x][u.y])
     59                 {
     60                     dp[m.x][m.y] = dp[u.x][u.y];
     61                     if(!visit[m.x][m.y]){
     62                         visit[m.x][m.y] = 1;
     63                         q.push(m);
     64                     }
     65                 }
     66             }
     67             for(int i=0;i<4;i++){
     68                 int xx = u.x+dir[i][0];
     69                 int yy = u.y+dir[i][1];
     70                 if(ok(xx,yy)){
     71                     if(dp[xx][yy] > dp[u.x][u.y] + 1){
     72                         dp[xx][yy] = dp[u.x][u.y] + 1;
     73                         if(!visit[xx][yy]){
     74                             visit[xx][yy]=1;
     75                             q.push(Node(xx,yy));
     76                         }
     77                     }
     78                 }
     79             }
     80         }
     81     }
     82 }
     83 
     84 int main()
     85 {
     86     freopen("test.in","rb",stdin);
     87     char a;
     88     while(~scanf("%d",&n)){
     89         //init
     90         for(int i=1;i<10;i++)G[i].clear();
     91         memset(dp,0x3f,sizeof(dp));
     92         memset(visit,0,sizeof(visit));
     93 
     94         for(int i=1;i<=n;i++){
     95             for(int j=1;j<=n;j++){
     96                 cin>>a;
     97                 if(a == 'S')
     98                 {
     99                     mat[i][j] = 0;
    100                     st = Node(i,j);
    101                 }
    102                 else if(a == 'E')
    103                 {
    104                     mat[i][j] = 0;
    105                     la = Node(i,j);
    106                 }
    107                 else if(a == '0' || a == '1'){
    108                     mat[i][j] = 0 + a - '0';
    109                 }
    110                 else{
    111                     mat[i][j] = 0 + a - '0';
    112                     G[mat[i][j]].push_back(Node(i,j));
    113                 }
    114             }
    115         }
    116 
    117         bfs();
    118         if(dp[la.x][la.y] == 0x3f3f3f3f){
    119             puts("Oh No!");
    120         }
    121         else{
    122             printf("%d
    ",dp[la.x][la.y]);
    123         }
    124     }
    125     return 0;
    126 }
  • 相关阅读:
    Codeforces Round #649 (Div. 2) A、B、C、
    poj1061 青蛙的约会(扩展欧几里得)
    Educational Codeforces Round 89 (Rated for Div. 2)A、B、C、D、E
    jxust摸底测试1
    Codeforces Round #648 (Div. 2) A、B、C、D、E、F
    大数模板
    任意进制转换(2019 ICPC Asia Yinchuan Regional Base62)
    求素数(从判断素数到筛法)
    直线 (__int128的使用)
    E. Tree Shuffling (Round #646 (Div. 2))
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4046473.html
Copyright © 2020-2023  润新知