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\n",dp[la.x][la.y]);

123         }

124     }

125     return 0;

126 }

 

你可能感兴趣的:(最短路)