题目大意:

不想介绍,题目链接: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 }

 

 posted on 2014-10-23 18:07  Love风吟  阅读(183)  评论(0编辑  收藏  举报