HDU2612 BFS优化
来源:互联网 发布:数控线切割编程视频 编辑:程序博客网 时间:2024/06/05 15:31
简单BFS。但是很容易超时
以下贴上TLE和AC 的代码
AC:(别人的代码)
#include <iostream>#include <algorithm>#include <queue>#include <string.h>using namespace std;char map[202][202];//地图int a[202][202];//保存第一个人Y到各个节点(坐标)的最小步数,有的节点不用访问,下面有说明int b[202][202];//保存第二个人Mint dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0};//方向int n,m;//地图大小int yx,yy,mx,my;//Y的坐标,M的坐标void getmap()//输入地图{ for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>map[i][j]; if(map[i][j]=='Y') { yx=i; yy=j; } else if(map[i][j]=='M') { mx=i; my=j; } }}//开始先记录出发的位置,直接从已知点出发,不用多次遍历。//这样也是从X Y出发的好处,方便记录坐标,应该从数量少的地方出发struct node{ int x,y;};void bfs(int x,int y,int num[202][202])//广搜{ queue<node>q; node aa,bb; aa.x=x; aa.y=y; num[x][y]=0; q.push(aa); while(!q.empty()) { bb=q.front(); q.pop(); for(int i=0;i<4;i++) { aa.x=bb.x+dx[i]; aa.y=bb.y+dy[i]; if(aa.x>=0&&aa.x<n&&aa.y>=0&&aa.y<m&&num[aa.x][aa.y]==0&&map[aa.x][aa.y]!='#') { num[aa.x][aa.y]=num[bb.x][bb.y]+1;//记录步数的方法。同时走过的地方也不用再做标记 q.push(aa); } } }}int main(){ while(cin>>n>>m) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); getmap(); bfs(yx,yy,a); bfs(mx,my,b); int minn=1000000; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(map[i][j]=='@'&&b[i][j]!=0)//必须保证此处@被访问过!写成a[i][j]!=0也可以 { minn=min(minn,a[i][j]+b[i][j]);//某个KFC地点两者到达的总步数之和,取最小值。每次求一次较小值 } } cout<<minn*11<<endl; } return 0;}
TLE:
#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;const int maxn=40000+50;int cnt,line,col;char maze[300][300],BLOCK='#';int dx[]={1,-1,0,0};int dy[]={0,0,1,-1};inline bool is_legal(int x,int y,char t){ return x>0&&y>0&&x<=col&&y<=line&&t!=BLOCK;}int bfsM(int x,int y){ int step=0,nx,ny; char mazeM[300][300]; for(int i=1;i<=line;i++) for(int j=1;j<=col;j++) mazeM[i][j]=maze[i][j]; pair<int,int>path[300][300]; queue<pair<int,int> >q; q.push(make_pair(x,y)); path[x][y]=make_pair(-1,-1); mazeM[x][y]=BLOCK; while(!q.empty()) { pair<int,int>fa=q.front(); q.pop(); for(int i=0;i<4;i++) { nx=dx[i]+fa.first,ny=dy[i]+fa.second; if(!is_legal(nx,ny,mazeM[nx][ny])) continue; path[nx][ny]=fa; if(mazeM[nx][ny]=='M') goto end2; q.push(make_pair(nx,ny)); mazeM[nx][ny]=BLOCK; } } end2:int x1=nx,y1=ny; while(x1!=-1) { int nx=path[x1][y1].first; int ny=path[x1][y1].second; x1=nx;y1=ny; step++; } return step-1;}int bfsY(int x,int y){ int step=0,nx,ny; char mazeY[300][300]; for(int i=1;i<=line;i++) for(int j=1;j<=col;j++) mazeY[i][j]=maze[i][j]; pair<int,int>path[300][300]; queue<pair<int,int> >q; q.push(make_pair(x,y)); path[x][y]=make_pair(-1,-1); mazeY[x][y]=BLOCK; while(!q.empty()) { pair<int,int>fa=q.front(); q.pop(); for(int i=0;i<4;i++) { nx=dx[i]+fa.first,ny=dy[i]+fa.second; if(!is_legal(nx,ny,mazeY[nx][ny])) continue; path[nx][ny]=fa; if(mazeY[nx][ny]=='Y') goto end1; q.push(make_pair(nx,ny)); //debug //printf("nx:%d ny:%d\n",nx,ny); //printf("%c\n",mazeY[nx][ny]); mazeY[nx][ny]=BLOCK; } } end1:int x1=nx,y1=ny; while(x1!=-1) { int nx=path[x1][y1].first; int ny=path[x1][y1].second; x1=nx;y1=ny; step++; } return step-1;}int main(){ int stepY,stepM,stepS[maxn]; while(scanf("%d%d",&line,&col)!=EOF) { cnt=0; memset(maze,0,sizeof(maze)); for(int i=1;i<=line;i++) scanf("%s",&maze[i][1]); for(int i=1;i<=line;i++) for(int j=1;j<=col;j++) if(maze[i][j]=='@') { stepY=bfsY(i,j); stepM=bfsM(i,j); //printf("Y:%d M:%d\n",stepY,stepM); stepS[cnt++]=stepM+stepY; } sort(stepS,stepS+cnt); printf("%d\n",stepS[0]*11);} return 0;}
阅读全文
1 0
- HDU2612 BFS优化
- hdu2612 bfs
- hdu2612简单BFS
- HDU2612---(两次BFS)
- hdu2612 两遍BFS
- [bfs]HDU2612 Find a way
- HDU2612 Find a way BFS
- BFS:HDU2612-Find a way(双向BFS)
- HDU2612(Find a way)搜索-两次BFS
- hdu2612 Find a way( bfs )
- hdu2612 Find a way--BFS & 打表
- hdu2612 Find a way(BFS)
- HDU2612 Find a way(双路广搜BFS)
- HDU2612 Find a way(双路BFS)
- hdu2612-Find a way(两次bfs)
- HDU2612 Find a way —— BFS
- hdu2612
- hdu2612
- ios成长之路 Navigation的统一布局
- 如何在HTTP客户端与服务器端之间保持状态 ?总结笔记
- java之ThreadLocal简单使用总结
- CDH集群开启Kerberos安全认证
- java中方法的参数传递机制
- HDU2612 BFS优化
- POJ3461-字符串匹配(基础)
- 宏EXPORT_SYMBOL在内核中的作用
- 15-Vue 之计算属性
- 二叉树的最近公共祖先、两个最远节点、第K层结点个数、出现次数超过一半的元素
- python assert 断言详细用法格式
- hdu1690 floyd
- 数据封装
- 石坑崆(猛坑石)攻略