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 }
我感觉思路挺清晰的