称不上算法的算法-3.bfs

1.HRBUST1613

待优化

注意换行对于char读取的影响!!!

bfs大体步骤:建立记录地图,确定起点,起点入队,以队列不空为条件循化,在循环内不断把队列的首元素当成操作元素,并把此操作元素的所有下层可能结果入队。

这样循环往复就可以把每层搜尽。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 using namespace std;
 5 char map[110][110];
 6 struct point{
 7     int x;
 8     int y;
 9 };
10 int xmove[4]={0,0,-1,1};
11 int ymove[4]={1,-1,0,0};
12 int times[110][110];
13 point P[10000];
14 int main(void){
15     int t;
16     scanf("%d",&t);
17     for(int tt=0;tt<t;tt++){
18         point start;
19         int sumofp=0;
20         int judg=0;
21         memset(times,0,sizeof(times));
22         int R,C;
23         scanf("%d%d",&R,&C);
24         getchar();
25         for(int i=0;i<R;i++){
26             for(int j=0;j<C;j++){
27                 scanf("%c",&map[i][j]);
28                 if(map[i][j]=='Z'){
29                     start.x=i;
30                     start.y=j;
31                 }
32                 else if(map[i][j]=='P'){
33                     point tmp;
34                     tmp.x=i;
35                     tmp.y=j;
36                     P[sumofp]=tmp;
37                     sumofp++;
38                 }
39             }
40             getchar();
41         }
42         queue<point> que;
43         que.push(start);
44         while(!que.empty()){
45             point atmp=que.front();
46             que.pop();
47             for(int g=0;g<4;g++){
48                 point nowoption;
49                 nowoption.x=atmp.x+xmove[g];
50                 nowoption.y=atmp.y+ymove[g];
51                 if(nowoption.x>=0&& nowoption.x<R&& nowoption.y>=0&& nowoption.y<C&& map[nowoption.x][nowoption.y]!='#'&&times[nowoption.x][nowoption.y]==0){
52                     if(map[nowoption.x][nowoption.y]=='W'){
53                         judg=1;
54                         printf("%d\n",times[atmp.x][atmp.y]+1);
55                         break;
56                     }
57                     else if(map[nowoption.x][nowoption.y]=='.'){
58                         que.push(nowoption);
59                         times[nowoption.x][nowoption.y]=times[atmp.x][atmp.y]+1;
60                     }
61                     else if(map[nowoption.x][nowoption.y]=='P'){
62                         for(int j=0;j<sumofp;j++){
63                             que.push(P[j]);
64                             times[P[j].x][P[j].y]=times[atmp.x][atmp.y]+1;
65                         }
66                     }
67                 }
68             }
69             if(judg==1)
70                 break;
71         }
72         if(judg==0){
73             printf("IMPOSSIBLE\n");
74         }
75     }
76 }

 2.HRBUST1621(时间最短)

使用优先队列,时间短优先

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 using namespace std;
 5 char map[220][220];
 6 int times[220][220];
 7 int xmove[4]={0,0,1,-1};
 8 int ymove[4]={1,-1,0,0};
 9 struct point{
10     int x,y;
11     int per_group;
12     bool operator< (const point&a)const{
13         return times[a.x][a.y]<times[x][y];
14     }
15 };
16 int main(void){
17     int T;
18     scanf("%d",&T);
19     for(int tt=0;tt<T;tt++){
20         memset(times,0,sizeof(times));
21         point start;
22         point endp;
23         int R,C;
24         scanf("%d%d",&R,&C);
25         getchar();
26         for(int i=0;i<R;i++){
27             for(int j=0;j<C;j++){
28                 scanf("%c",&map[i][j]);
29                 if(map[i][j]=='Z'){
30                     start.x=i;
31                     start.y=j;
32                 }
33                 if(map[i][j]=='W'){
34                     endp.x=i;
35                     endp.y=j;
36                 }
37             }
38             getchar();
39         }
40         priority_queue<point> que;
41         que.push(start);
42         while(!que.empty()){
43             point nowpoint=que.top();
44             que.pop();
45             for(int i=0;i<4;i++){
46                 point tmp;
47                 tmp.x=nowpoint.x+xmove[i];
48                 tmp.y=nowpoint.y+ymove[i];
49                 if(tmp.x>=0&&tmp.x<R&&tmp.y>=0&&tmp.y<C&&map[tmp.x][tmp.y]!='#'&&times[tmp.x][tmp.y]==0){
50                     if(map[tmp.x][tmp.y]=='W'){
51                         times[tmp.x][tmp.y]=times[nowpoint.x][nowpoint.y]+1;
52                         break;
53                     }
54                     if(map[tmp.x][tmp.y]=='.'){
55                         times[tmp.x][tmp.y]=times[nowpoint.x][nowpoint.y]+1;
56                     }
57                     else{
58                         times[tmp.x][tmp.y]=times[nowpoint.x][nowpoint.y]+1+map[tmp.x][tmp.y]-'0';
59                     }
60                     que.push(tmp);
61                 }
62             }
63         }
64         if(times[endp.x][endp.y]==0)
65             printf("IMPOSSIBLE\n");
66         else
67             printf("%d\n",times[endp.x][endp.y]);
68     }
69 }

 3.HDU1026(时间最短+打印路径)

打印路径用递归

 1 #include<stdio.h>
 2 #include<queue>
 3 #include<string.h>
 4 char themap[150][150];
 5 int xmove[4]={0,0,1,-1};
 6 int ymove[4]={1,-1,0,0};
 7 int dir[150][150];
 8 int ti[150][150];
 9 int n,m,sum;
10 struct node{
11     int x,y;
12     int times;
13     friend bool operator <(node a,node b){
14         return a.times>b.times;
15     }
16 };
17 using namespace std;
18 void show(int x,int y){
19     if(x==0&&y==0)
20         return;
21     show(x-xmove[dir[x][y]],y-ymove[dir[x][y]]);
22     printf("%ds:(%d,%d)->(%d,%d)\n",sum,x-xmove[dir[x][y]],y-ymove[dir[x][y]],x,y);
23     sum++;
24     while(ti[x][y]!=0){
25         printf("%ds:FIGHT AT (%d,%d)\n",sum,x,y);
26         sum++;
27         ti[x][y]--;
28     }
29 }
30 int main(void){
31     while(scanf("%d%d",&n,&m)==2){
32         int judg=0;
33         sum=1;
34         getchar();
35         memset(ti,0,sizeof(ti));
36         memset(themap,-1,sizeof(themap));
37         memset(dir,-1,sizeof(dir));
38         for(int i=0;i<n;i++){
39             for(int j=0;j<m;j++){
40                 scanf("%c",&themap[i][j]);
41             }
42             getchar();
43         }
44         node start;
45         start.x=0;
46         start.y=0;
47         start.times=0;
48         themap[0][0]='X';
49         priority_queue<node> que;
50         que.push(start);
51         while(!que.empty()){
52             node nownode;
53             nownode=que.top();
54             que.pop();
55             if(nownode.x==n-1&&nownode.y==m-1){
56                 judg=1;
57                 printf("It takes %d seconds to reach the target position, let me show you the way.\n",nownode.times);
58                 break;
59             }
60             for(int i=0;i<4;i++){
61                 node tmp;
62                 tmp.x=nownode.x+xmove[i];
63                 tmp.y=nownode.y+ymove[i];
64                 tmp.times=nownode.times+1;
65                 if(tmp.x>=0&&tmp.x<n&&tmp.y>=0&&tmp.y<m&&themap[tmp.x][tmp.y]!='X'){
66                     if(themap[tmp.x][tmp.y]=='.'){
67                         themap[tmp.x][tmp.y]='X';
68                     }
69                     else{
70                         tmp.times+=themap[tmp.x][tmp.y]-'0';
71                         ti[tmp.x][tmp.y]=themap[tmp.x][tmp.y]-'0';
72                         themap[tmp.x][tmp.y]='X';
73                     }
74                     dir[tmp.x][tmp.y]=i;
75                     que.push(tmp);
76                 }
77             }
78         }
79         if(judg==0){
80             printf("God please help our poor hero.\n");
81         }
82         else{
83             show(n-1,m-1);
84         }
85         printf("FINISH\n");
86     }
87 }

 

posted @ 2018-04-27 23:42  超级猿  阅读(200)  评论(0编辑  收藏  举报