HDU2822 Dogs

一般来说走一步不固定加上的权值的时候最好用优先队列,可以保证最优解;

做题目的时候先预先自己走一下路线,如果自己都不会走程序肯定写不出来的啦.

要好好分析走的过程,这样才可以一步到位;

 1 #include<iostream>
 2 #include<queue>
 3 #define maxn 1005
 4 int n,m;
 5 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
 6 int bx,by,ex,ey;
 7 struct node
 8 {
 9     int x,y,t;
10     friend bool operator <(node a,node b)//优先队列必须的
11     {
12         return a.t>b.t ;
13     }
14 }p,q;
15 char map[maxn][maxn];
16 bool visit[maxn][maxn];
17 using namespace std;
18 int bfs(int x,int y)
19 {
20     int i;
21     priority_queue<node> game;
22     p.x=x,p.y=y,p.t=0;
23     game.push(p);
24     visit[p.x][p.y]=true;
25     while(!game.empty())
26     {
27         q=game.top();
28         game.pop();
29         if(q.x == ex && q.y == ey) return q.t;
30         for(i=0;i<4;i++)
31         {
32          p.x=q.x+dir[i][0],p.y=q.y+dir[i][1],p.t=q.t;
33          if(p.x<0 || p.x>=n || p.y<0 || p.y>=m || visit[p.x][p.y])//淘汰不满足条件的点
34              continue;
35          visit[p.x][p.y]=true;
36          if(map[p.x][p.y]=='.')  p.t=q.t+1;//经过空地需要挖坑
37         game.push(p);
38 
39         }
40     }
41     return -1;
42 }
43 int main()
44 {
45     int i;
46     //freopen("2822.txt","r",stdin);
47     while(~scanf("%d%d",&n,&m),n,m)
48     {
49         memset(visit,false,sizeof(visit));
50         for(i=0;i<n;i++)
51         
52             scanf("%s",map+i);//比用cin快
53             
54         scanf("%d%d%d%d",&bx,&by,&ex,&ey);
55         bx--,by--,ex--,ey--;//从0读入
56         int t=bfs(bx,by);
57         printf("%d\n",t);
58     }
59     return 0;
60 }

 

转载于:https://www.cnblogs.com/xiaoniuniu/p/4019945.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值