HDU-2612(双BFS)
2012-10-04 20:42
274 查看
#include <stdio.h> #include <cstring> #define Max 0x7f7f7f7f using namespace std; int visited1[205][205]; int visited2[205][205]; int ans1[205][205]; int ans2[205][205]; int x1,y1,x2,y2; int n,m; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; char map[205][205]; struct node { int x; int y; }; node path[80000]; void bfs(int x ,int y,int ans[205][205],int visited[205][205]) { memset(visited,0,sizeof(visited)); memset(ans,Max,sizeof(ans)); path[0].x=x; path[0].y=y; ans[x][y]=0; int head=0; int tail=1; visited[x][y]=1; while(head<tail) { x=path[head].x; y=path[head].y; for(int i=0;i<4;i++) { int xx=x+dir[i][0]; int yy=y+dir[i][1]; if(visited[xx][yy]==0 && xx>=0 && xx<n && yy>=0 && yy<m && map[xx][yy]!='#') { path[tail].x=xx; path[tail].y=yy; tail++; ans[xx][yy]=ans[x][y]+1; visited[xx][yy]=1; } } head++; } } int main() { char ch; while(scanf("%d%d",&n,&m)!=EOF) { getchar(); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%c",&ch); map[i][j]=ch; if(ch=='Y') { x1=i; y1=j; } if(ch=='M') { x2=i; y2=j; } } getchar(); } memset(visited1,0,sizeof(visited1)); memset(ans1,Max,sizeof(ans1)); bfs(x1,y1,ans1,visited1); memset(visited2,0,sizeof(visited2)); memset(ans2,Max,sizeof(ans2)); bfs(x2,y2,ans2,visited2); int min=Max; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(map[i][j]=='@'&& ans1[i][j]!=Max && ans2[i][j]!=Max) { if(min>ans1[i][j]+ans2[i][j]) min=ans1[i][j]+ans2[i][j]; } } } printf("%d\n",min*11); } return 0; }
好长时间都没有写过BFS了,,,手生的不行,,,看着别人的代码回忆自己的风格咯,,呼呼
写出来居然看不出哪里错了,,,看着和别人的代码一样呀...
贴出自己的:
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <queue> #define inf 0x3fffffff using namespace std; struct node{ int x; int y; int step; }kfc[1001],info,pos; int N,M; char map[222][222]; int Y_x,Y_y; int M_x,M_y; int ans1[1001],ans2[1001],ans[1001]; int visit[222][222]; int dis[4][2]={0,1,1,0,0,-1,-1,0}; int cnt; int judge(node t) { if(t.x<1||t.x>N||t.y<1||t.y>M||map[t.x][t.y]=='#') return 0; else return 1; } void BFS_Y(int x,int y) { queue <node > q; memset(visit,0,sizeof(visit)); memset(ans1,-1,sizeof(ans1)); info.x=x; info.y=y; info.step=0; q.push(info); visit[x][y]=1; while(!q.empty()) { node t; t=q.front(); q.pop(); for(int i=0;i<4;i++) { pos.x=t.x+dis[i][0]; pos.y=t.y+dis[i][1]; pos.step=t.step; if(!visit[pos.x][pos.y]&&judge(pos)) { visit[pos.x][pos.y]=1; if(map[pos.x][pos.y]=='.') { pos.step++; q.push(pos); } else if(map[pos.x][pos.y]=='@') { for(int i=1;i<cnt;i++) { if(kfc[i].x==pos.x&&kfc[i].y==pos.y) { ans1[i]=pos.step+1; // printf("%d_____%d\n",i,ans1[i]); break; } } } } } } } void BFS_M(int x,int y) { queue <node > q; memset(visit,0,sizeof(visit)); memset(ans2,-1,sizeof(ans2)); info.x=x; info.y=y; info.step=0; q.push(info); visit[x][y]=1; while(!q.empty()) { node t; t=q.front(); q.pop(); for(int i=0;i<4;i++) { pos.x=t.x+dis[i][0]; pos.y=t.y+dis[i][1]; pos.step=t.step; if(!visit[pos.x][pos.y]&&judge(pos)) { visit[pos.x][pos.y]=1; if(map[pos.x][pos.y]=='.') { pos.step++; q.push(pos); } else if(map[pos.x][pos.y]=='@') { for(int i=1;i<cnt;i++) { if(kfc[i].x==pos.x&&kfc[i].y==pos.y) { ans2[i]=pos.step+1; // printf("%d_____%d\n",i,ans2[i]); break; } } } } } } } int main() { while(scanf("%d%d",&N,&M)!=EOF) { cnt=1; for(int i=1;i<=N;i++) { scanf("%s",map[i]+1); for(int j=1;j<=M;j++) { if(map[i][j]=='Y') { Y_x=i; Y_y=j; } else if(map[i][j]=='M') { M_x=i; M_y=j; } else if(map[i][j]=='@') { kfc[cnt].x=i; kfc[cnt].y=j; // printf("cnt=%d %d****%d \n",cnt,kfc[cnt].x,kfc[cnt].y); cnt++; } } } BFS_Y(Y_x,Y_y); BFS_M(M_x,M_y); int Min=inf; for(i=1;i<cnt;i++) { // printf("ans1====%d______ans2=%d \n",ans1[i],ans2[i]); if(ans1[i]!=-1&&ans2[i]!=-1) { int t=ans1[i]+ans2[i]; if(t<Min) Min=t; } } printf("%d\n",Min*11); } return 0; }
然后是别人的:
相关文章推荐
- HDU 2612 -Find a way (注意细节的BFS)
- HDU 2612 Find a way(BFS)
- Find a way HDU - 2612 双向BFS
- HDU - 2612 Find a way(15.10.10 搜索专题)bfs
- HDU 2612 Find a way——bfs
- HDU 2612 Find a way(双BFS)
- HDU 2612 Find a way(BFS)
- HDU 2612 Find a way【双重BFS】
- hdu 2612 Find a way (BFS)
- hdu-2612-find a way(bfs)
- HDU-2612--Find a way---BFS广搜
- HDU 2612 Find a way(bfs)
- Problem N HDU 2612 Find a way (两次BFS求最值)
- HDU 2612 Find a way(BFS)
- HDU.2612 Find a way (BFS)
- HDU - 2612 bfs [kuangbin带你飞]专题一
- HDU 2612 Find a way(BFS)
- 【HDU 2612 Find a Way(BFS)】(兼BFS入门笔记)
- HDU2612---(两次BFS)
- hdu 2612 Find a way(BFS)