标签:bfs
题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728
2 5 5 ...** *.**. ..... ..... *.... 1 1 1 1 3 5 5 ...** *.**. ..... ..... *.... 2 1 1 1 3
no yes
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #include <malloc.h> #include <ctype.h> #include <math.h> #include <string> #include <iostream> #include <algorithm> using namespace std; #include <stack> #include <queue> #include <vector> #include <deque> #include <set> #include <map> #define INF 999999999 #define eps 0.00001 #define LL __int64 #define pi acos(-1.0) struct point { int x,y; int step;//记录转弯数。 }; int vis[110][110]; int n,m; int dir[4][2]={ 1,0, -1,0, 0,1, 0,-1 }; char mp[110][110]; int ok(point nw) { if(nw.x>=0&&nw.x<n&&nw.y>=0&&nw.y<m&&mp[nw.x][nw.y]=='.') return 1; return 0; } int sx,sy,ex,ey; int bfs() { memset(vis,0,sizeof vis); point sta,nw,nex; sta.x=sx; sta.y=sy; sta.step=-1;//第一次不算转弯 queue<point>q; q.push(sta); while(!q.empty()) { nw=q.front(); if(nw.x==ex&&nw.y==ey) return max(0,nw.step); q.pop(); for(int i=0;i<4;i++) { nex=nw; nex.x+=dir[i][0]; nex.y+=dir[i][1]; nex.step=nw.step+1;//因为是走到了尽头了,所以每一次 //每次step只加1,所以可以用bool vis while(ok(nex)) { if(vis[nex.x][nex.y]==0) { q.push(nex); vis[nex.x][nex.y]=1;//停在这个点。 } nex.x+=dir[i][0]; nex.y+=dir[i][1]; } } } return 999999; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",mp[i]); int k; scanf("%d%d%d%d%d",&k,&sy,&sx,&ey,&ex); sy--,sx--,ey--,ex--; int ans=bfs(); if(k>=ans) printf("yes\n"); else printf("no\n"); } return 0; } /* 2 5 5 ...** *.**. ..... ..... *.... 1 1 1 1 3 5 5 ...** *.**. ..... ..... *.... 2 1 1 1 3 */
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:bfs
原文地址:http://blog.csdn.net/u013532224/article/details/46804971