pku 2312 Battle City

题目来源:http://acm.pku.edu.cn/JudgeOnline/problem?id=2312

 这个题目其实比较简单

广度搜索就可以了,需要注意的就是广度搜索的时候需要对点进行优先排序,使权值小的点优先扩展。

这里用到了pop_heap(),push_heap()函数,具体来说就是用堆来实现优先队列。

 

代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
 1 #include <iostream>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 struct point
 7 {
 8     int x,y,d;
 9 };
10 
11 int cmp(const point &a,const point &b)
12 {
13     return a.d>b.d;
14 }
15 
16 point head[310*310];
17 
18 int dx[]={1,-1,0,0};
19 int dy[]={0,0,1,-1};
20 
21 int headsize;
22 char m[310][310];
23 int d[310][310];
24 int r,c;
25 
26 int isIn(int x,int y){return x>=0&&x<r&&y>=0&&y<c;}
27 
28 void solve()
29 {
30     for(int i=0;i<r;i++)
31         scanf("%s",m[i]);
32     for(int i=0;i<r;i++)
33         for(int j=0;j<c;j++)
34         {
35             d[i][j]=0x0fffffff;
36             if(m[i][j]=='Y')
37             {
38                 d[i][j]=0;
39                 head[0].x=i;head[0].y=j;head[0].d=0;headsize=1;
40             }
41         }
42     while(headsize)
43     {
44         int cx=head[0].x,cy=head[0].y,td=head[0].d;
45         if(m[cx][cy]=='T'break;
46         pop_heap(head,head+headsize,cmp);
47         headsize--;
48         for(int k=0;k<4;k++)
49         {
50             int nx=cx+dx[k];
51             int ny=cy+dy[k];
52             if(!isIn(nx,ny)) continue;
53             int nd;
54             if(m[nx][ny]=='B') nd=td+2;
55             else if(m[nx][ny]=='E') nd=td+1;
56             else if(m[nx][ny]=='T') nd=td+1;
57             else continue;
58             if(nd>=d[nx][ny]) continue;
59             d[nx][ny]=nd;
60             head[headsize].x=nx;
61             head[headsize].y=ny;
62             head[headsize].d=nd;
63             headsize++;push_heap(head,head+headsize,cmp);
64         }
65     }
66     if(headsize==0) printf("-1\n");
67     else printf("%d\n",head[0].d);
68 }
69 
70 int main()
71 {
72     freopen("test.txt","r",stdin);
73     while(scanf("%d%d",&r,&c)!=EOF&&r&&c)
74     {
75         solve();
76     }
77 }

转载于:https://www.cnblogs.com/cherip/archive/2008/10/26/1319895.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值