杭电2612 Find a way BFS 搜索
来源:互联网 发布:用单片机测量电能 编辑:程序博客网 时间:2024/05/17 08:32
题意:很多家肯德基店,求两个人去同一家的总的最短时间
#include<cstdio> #include<cstring> #include<iostream> #include<queue> using namespace std; #define min(a,b) (a)>(b)?(b):(a) #define INF 1<<29 #define N 205 int dir[4][2]={{-1,0}, {1,0}, {0,-1}, {0,1}}; int foot1[N][N]; int foot2[N][N]; bool visit[N][N]; char map[N][N]; int n,m,Yx,Yy,Mx,My; struct node { int x,y,sum; }; void Init() { int i; for(i=0;i<=m+1;i++) { map[0][i]='#'; map[n+1][i]='#'; } for(i=0;i<=n+1;i++) { map[i][0]='#'; map[i][m+1]='#'; } } void bfsY(int x,int y) { int i; node p,q; queue<node> Q; p.x=x;p.y=y;p.sum=0; memset(foot1,0,sizeof(foot1)); memset(visit,false,sizeof(visit)); visit[p.x][p.y]=true; foot1[p.x][p.y]=0; Q.push(p); while(!Q.empty()) { p=Q.front();Q.pop(); for(i=0;i<4;i++) { q.x=p.x+dir[i][0]; q.y=p.y+dir[i][1]; q.sum=p.sum+1; if(!visit[q.x][q.y]&&map[q.x][q.y]!='#') { visit[q.x][q.y]=true; foot1[q.x][q.y]=q.sum; Q.push(q); } } } } void bfsM(int x,int y) { int i; node p,q; queue<node> Q; p.x=x;p.y=y;p.sum=0; memset(foot2,0,sizeof(foot2)); memset(visit,false,sizeof(visit)); visit[p.x][p.y]=true; foot2[p.x][p.y]=0; Q.push(p); while(!Q.empty()) { p=Q.front();Q.pop(); for(i=0;i<4;i++) { q.x=p.x+dir[i][0]; q.y=p.y+dir[i][1]; q.sum=p.sum+1; if(!visit[q.x][q.y]&&map[q.x][q.y]!='#') { visit[q.x][q.y]=true; foot2[q.x][q.y]=q.sum; Q.push(q); } } } } int main() { int i,j; char ch[205]; while(scanf("%d%d",&n,&m)!=EOF) { Init(); for(i=1;i<=n;i++) { scanf("%s",ch); for(j=0;j<m;j++) { map[i][j+1]=ch[j]; if(ch[j]=='Y') { Yx=i;Yy=j+1; } if(ch[j]=='M') { Mx=i;My=j+1; } } } bfsY(Yx,Yy); bfsM(Mx,My); int ans=INF; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { if(map[i][j]=='@'&&foot1[i][j]&&foot2[i][j])//注意不是每个KFC Y和M都能到达 { ans=min(ans,foot1[i][j]+foot2[i][j]); } } printf("%d\n",ans*11); } return 0; }
写法二
#include<stdio.h>#include<string.h>#include<iostream>#include<queue>using namespace std;#define INF 0x3f3f3f3f#define N 210int n, m;char maps[N][N];int vis[N][N], dis[N][N][2], f;int dir[4][2]={{1,0}, {0,1}, {-1,0}, {0,-1}};struct node{ int x, y, step;};queue <node> q;void BFS(int x, int y){ node head, next; head.x=x; head.y=y; head.step=0; vis[x][y]=1; q.push(head); while(!q.empty()) { head=q.front(); q.pop(); for(int i=0; i<4; i++) { next.x=head.x+dir[i][0]; next.y=head.y+dir[i][1]; if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&!vis[next.x][next.y] &&(maps[next.x][next.y]=='.'||maps[next.x][next.y]=='@')) { vis[next.x][next.y]=1; next.step=head.step+1; if(maps[next.x][next.y]=='@') dis[next.x][next.y][f]=min(dis[next.x][next.y][f], next.step); q.push(next); } } }}int main(){ while(~scanf("%d%d", &n, &m)) { memset(dis, INF, sizeof(dis)); for(int i=0; i<n; i++) scanf("%s", maps[i]); for(int i=0; i<n; i++) for(int j=0; j<m; j++) { if(maps[i][j]=='Y') { f=0; memset(vis, 0, sizeof(vis)); BFS(i, j); } else if(maps[i][j]=='M') { f=1; memset(vis, 0, sizeof(vis)); BFS(i, j); } } int ans=INF; for(int i=0; i<n; i++) for(int j=0; j<m; j++) { if(maps[i][j]=='@'&&ans>dis[i][j][0]+dis[i][j][1]) ans=dis[i][j][0]+dis[i][j][1]; } printf("%d\n", ans*11); }}
0 0
- 杭电2612 Find a way BFS 搜索
- 杭电搜索 2612 Find a way
- 杭电2612 Find a way(BFS)
- BFS基础题 杭电2612 Find a way 1252 Hike on a Graph
- 杭电---2612 find a way
- 杭电2612Find a way
- 【杭电】[2612]Find a way
- HDU 2612 find a way(双搜索)BFS
- hdoj 2612 Find a way (bfs,双向搜索)
- HDU2612(Find a way)搜索-两次BFS
- Find a way bfs搜索 容易出错
- Find a way(BFS)
- hdu 2612 Find a way(BFS)
- HDU 2612 Find a way(两次BFS)
- hdoj 2612 Find a way (BFS)
- HDU 2612 Find a way(BFS)
- HDU 2612 Find a way BFS
- Hdu 2612 Find a way(bfs)
- L1-010. 比较大小
- 网页中插入视频方式
- Android 捕获系统log
- spring-mvc多视图解析配置实例 ContentNegotiatingViewResolver
- Servlet基础
- 杭电2612 Find a way BFS 搜索
- linux安装tomcat
- Jsp初识
- 迪杰斯特拉算法
- 隐藏调用API函数
- common.js与AMD
- 关于Android studio2.3+项目上线前签名打包的步骤
- mac读不出移动硬盘怎么办
- Centos7.0 下搭建 Nginx