HDU - 2612 Find a way(BFS搜索)
作者:互联网
题目:
思路:
用BFS分别以‘Y’和‘M’的位置为起点进行两次搜索,并把这两次的搜索结果在一个二维数组中保存下来,在对地图遍历遇到‘@’更行最小值。
PS:
如果用‘Y’和‘M’点分别去搜每个‘@’,这样妥妥的会超时。当时做这个题脑抽的一批……(烦!!!)
另外如果‘Y’和‘M’到不了‘@’这里的值为0,应该把这种情况排除。
代码:
//#include <bits/stdc++.h> #include <queue> #include <cstdio> #include <iomanip> #include <string> #include <cstring> #include <iostream> #include <algorithm> #define inf 0x3f3f3f3f #define MAX 1000000000 #define mod 1000000000 #define FRE() freopen("in.txt","r",stdin) #define FRO() freopen("out.txt","w",stdout) using namespace std; typedef long long ll; typedef pair<int,int> P; const int maxn = 205; char mp[maxn][maxn]; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; int n,m; int vis[maxn][maxn],sum[maxn][maxn]; struct Node{ int x,y,cost; }; bool isin(int x,int y){ return x>=0&&x<n&&y>=0&&y<m; } void BFS(int x,int y){ memset(vis,0,sizeof(vis)); vis[x][y] = 1; queue<Node>que; que.push(Node{x,y,0}); while(!que.empty()){ Node u = que.front(); que.pop(); for(int i=0; i<4; i++){ int tx = u.x+dx[i],ty = u.y+dy[i]; if(isin(tx,ty) && !vis[tx][ty] && mp[tx][ty]!='#'){ vis[tx][ty] = 1; sum[tx][ty] += u.cost+11; que.push(Node{tx,ty,u.cost+11}); } } } return; } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ for(int i=0; i<n; i++){ scanf("%s",mp[i]); } memset(sum,0,sizeof(sum)); for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ if(mp[i][j]=='Y'){ BFS(i,j); }else if(mp[i][j]=='M'){ BFS(i,j); } } } int ans = 1000000000; for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ if(mp[i][j]=='@' && sum[i][j]!=0){ ans = min(ans,sum[i][j]); } } } printf("%d\n",ans); } return 0; }
标签:Node,HDU,2612,int,BFS,maxn,que,include,define 来源: https://www.cnblogs.com/sykline/p/10464460.html