题目来源:http://acm.pku.edu.cn/JudgeOnline/problem?id=2312
这个题目其实比较简单
广度搜索就可以了,需要注意的就是广度搜索的时候需要对点进行优先排序,使权值小的点优先扩展。
这里用到了pop_heap(),push_heap()函数,具体来说就是用堆来实现优先队列。
代码:
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 }
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 }