Find a way bfs搜索 容易出错
2017-05-20 10:09
120 查看
题目链接:题意:给你一个图,图中有不能走的障碍物,和两人,以及n个(n>=1)KFC,现在要求找到其中一个KFC,让两个人人走到这个KFC的时间总和最小;
这道题本来没什么的!!但是有个很恶心的坑点,就是并不是每个KFC都可以达到的,,所以将step初始化为0就错了(因为这样初始化为0的话,如果两个人,都不能到达这个KFC,那么最终total读取的值就为0,也就是这个两个人都无法达到的点输出总的时间是0.。。。。。。)
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <queue> #include <map> #include <algorithm> #include <set> using namespace std; #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const int mod = 1000000007; const double eps = 1e-10; const int inf = 0x3f3f3f3f; const int big=50000; ll max(int a,int b) {return a>b?a:b;}; ll min(int a,int b) {return a<b?a:b;}; char f[205][205]; int xa,ya,xb,yb; int dx[5]={-1,1,0,0}; int dy[5]={0,0,1,-1}; int vis[205][205]; ll step[205][205]; ll total[205][205]; int n,m; int legal(int x,int y) { if(x<0||y<0||x>=n||y>=m) return 0; else if(vis[x][y]) return 0; else if(f[x][y]=='#') return 0; return 1; } void bfs(int x,int y) { memset(vis,0,sizeof(vis)); memset(step,inf,sizeof(step)); step[x][y]=0; vis[x][y]=1; queue<int> qx; queue<int> qy; qx.push(x);qy.push(y); while(qx.size()) { int tx=qx.front();qx.pop(); int ty=qy.front();qy.pop(); for(int i=0;i<4;i++) { int rx=tx+dx[i]; int ry=ty+dy[i]; if(!legal(rx,ry)) continue; step[rx][ry]=step[tx][ty]+1; vis[rx][ry]=1; qx.push(rx);qy.push(ry); } } } int main() { while(~scanf("%d %d",&n,&m)) { for(int i=0;i<n;i++) { scanf("%s",f[i]); for(int j=0;j<m;j++) if(f[i][j]=='M') {xa=i;ya=j;} else if(f[i][j]=='Y') {xb=i;yb=j;} } //cout<<xa<<" "<<ya<<" "<<xb<<" "<<yb<<endl; memset(total,0,sizeof(total)); bfs(xa,ya); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { // cout<<step[i][j]<<endl; total[i][j]+=step[i][j]; } bfs(xb,yb); for(int i=0;i<n;i++) for(int j=0;j<m;j++) total[i][j]+=step[i][j]; ll ans=inf; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(f[i][j]=='@') if(total[i][j]<inf) ans=min(ans,total[i][j]); //printf("%d\n",total[i][j]); } printf("%lld\n",ans*11); } return 0; }
这道题本来没什么的!!但是有个很恶心的坑点,就是并不是每个KFC都可以达到的,,所以将step初始化为0就错了(因为这样初始化为0的话,如果两个人,都不能到达这个KFC,那么最终total读取的值就为0,也就是这个两个人都无法达到的点输出总的时间是0.。。。。。。)
相关文章推荐
- C++不得不知道的几点容易出错的知识点--1
- 代码这么写极其容易出错
- shell脚本容易出错的地方
- hive安装时注意的东西和容易出错的地方
- 4.2以上 WebView 页面调用Java对象容易出错的地方
- Python笔记-容易出错应牢记的基础知识
- C/C++ 关于字符串的处理容易出错的地方
- 收藏的几个容易出错的面试题
- 用JS写递归中容易出错的点
- 一道微软2013实习生招聘题(c++,特别容易出错)
- 容易出错的指针问题
- java综合小知识 容易出错
- IE和Firefox中容易出错的Javascript
- C语言容易出错的地方
- js数组操作,拼写好像,没看清楚就容易出错的。
- 容易出错的Java笔试题
- 一道容易出错的笔试题
- c语言:宏里面参数不加括号容易出错,在使用时尽量加括号及举例
- PHP容易出错在十四个问题
- 简单基础的问题,但是非常容易出错.