NYOJ-284简单BFS注意下优先队列的使用就可以了

View Code
  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<queue>
  4 #include<iostream>
  5 #include<cstring>
  6 
  7 using namespace std;
  8 
  9 typedef struct 
 10   {
 11     int x, y;
 12    int step;
 13 }Point;
 14   
 15 priority_queue<Point> q;
 16 bool operator<(Point a, Point b)
 17 {
 18     return a.step > b.step;
 19 } 
 20 
 21 char map[301][301];
 22 int visit[301][301];
 23 int N, M, ok, si, sj;
 24 int dx[4] = {1,-1,0,0};
 25 int dy[4] = {0,0,1,-1}; 
 26 
 27 int True(Point v)
 28 {
 29    if(v.x>=0 && v.x<M && v.y>=0 && v.y<N)
 30      return  1;
 31     return 0;
 32 }
 33 
 34 int main()
 35 {
 36     int i,j,di,dj;
 37     Point start,target;
 38     
 39     while(scanf("%d%d",&M,&N)!=EOF)
 40     {      
 41        getchar();
 42        if(M==0&&N==0)  break;         
 43        for(i=0; i<M; i++)
 44        {
 45           scanf("%s",map[i]); 
 46           getchar();
 47        }       
 48        for(i=0; i<M; i++)                         
 49         for(j=0; j<N; j++)                            
 50         {     
 51             if(map[i][j]=='Y')
 52             {
 53                si = i;
 54                sj = j;
 55             }                  
 56             if(map[i][j]=='T')
 57             {
 58                di = i;
 59                dj = j;
 60             } 
 61          }
 62          memset(visit,0,sizeof(visit));
 63          start.x = si;
 64          start.y = sj;
 65          start.step = 0;
 66          ok = 0;
 67          visit[start.x][start.y] = 1; 
 68          q.push(start); 
 69          while( !q.empty() )
 70          {   
 71             Point u = q.top();   
 72             q.pop();
 73             if(u.x==di&&u.y==dj)
 74             {
 75                 ok = 1;
 76                 printf("%d\n",u.step); 
 77                 break;
 78             }
 79             for(i=0; i<4; i++)
 80             {
 81                Point v;
 82                v.x = u.x + dx[i];
 83                v.y = u.y + dy[i];
 84                if(True(v)&&!visit[v.x][v.y]&&map[v.x][v.y]!='S'&&map[v.x][v.y]!='R')
 85                {
 86                   if(map[v.x][v.y]=='B')
 87                     v.step = u.step + 2; 
 88                   else  
 89                     v.step = u.step + 1; 
 90                    visit[v.x][v.y] = 1;  
 91                    q.push(v); 
 92                }
 93             } 
 94          }
 95          while(!q.empty())
 96          {
 97               q.pop();
 98          }  
 99          if(!ok)
100               printf("-1\n");
101     }
102     return 0;
103 } 
104                  

转载于:https://www.cnblogs.com/cn19901203/archive/2012/04/24/2468887.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值