hdu2612(BFS)

今天第一次动手写BFS,原理都懂,只是原来一直没有实现过,实现起来感觉还是蛮简单的

没有用队列,用的是数组

这道题:求2个点到KFC的距离之和,使其最小,可用2次BFS,分别求出2个点到各个KFC的最短距离,然后找出和最小的即可

 1 #include <stdio.h>
 2 #include <cstring>
 3 #define Max 0x7f7f7f7f
 4 using namespace std;
 5 int visited1[205][205];
 6 int visited2[205][205];
 7 int ans1[205][205];
 8 int ans2[205][205];
 9 int x1,y1,x2,y2;
10 int n,m;
11 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
12 char map[205][205];
13 struct node
14 {
15     int x;
16     int y;
17 };
18 node path[80000];
19 void bfs(int x ,int y,int ans[205][205],int visited[205][205])
20 {
21     memset(visited,0,sizeof(visited));
22     memset(ans,Max,sizeof(ans));
23     path[0].x=x;
24     path[0].y=y;
25     ans[x][y]=0;
26     int head=0;
27     int tail=1;
28     visited[x][y]=1;
29     while(head<tail)
30     {
31         x=path[head].x;
32         y=path[head].y;
33         for(int i=0;i<4;i++)
34         {
35             int xx=x+dir[i][0];
36             int yy=y+dir[i][1];
37             if(visited[xx][yy]==0 && xx>=0 && xx<n && yy>=0 && yy<m && map[xx][yy]!='#')
38             {
39                 path[tail].x=xx;
40                 path[tail].y=yy;
41                 tail++;
42                 ans[xx][yy]=ans[x][y]+1;
43                 visited[xx][yy]=1;
44             }
45         }
46         head++;
47     }
48 }
49 int main()
50 {
51     char ch;
52     while(scanf("%d%d",&n,&m)!=EOF)
53     {
54         getchar();
55         for(int i=0;i<n;i++)
56         {
57             for(int j=0;j<m;j++)
58             {
59                 scanf("%c",&ch);
60                 map[i][j]=ch;
61                 if(ch=='Y')
62                 {
63                     x1=i;
64                     y1=j;
65                 }
66                 if(ch=='M')
67                 {
68                     x2=i;
69                     y2=j;
70                 }
71             }
72             getchar();
73         }
74         memset(visited1,0,sizeof(visited1));
75         memset(ans1,Max,sizeof(ans1));
76         bfs(x1,y1,ans1,visited1);
77         memset(visited2,0,sizeof(visited2));
78         memset(ans2,Max,sizeof(ans2));
79         bfs(x2,y2,ans2,visited2);
80         int min=Max;
81         for(int i=0;i<n;i++)
82         {
83             for(int j=0;j<m;j++)
84             {
85                 if(map[i][j]=='@'&& ans1[i][j]!=Max && ans2[i][j]!=Max)
86                 {
87                     if(min>ans1[i][j]+ans2[i][j])
88                     min=ans1[i][j]+ans2[i][j];
89                 }
90             }
91         }
92         printf("%d\n",min*11);
93     }
94 
95     return 0;
96 }

我感觉思路挺清晰的

posted on 2012-08-15 20:32  矮人狙击手!  阅读(287)  评论(0编辑  收藏  举报

导航