2 5 5 ...** *.**. ..... ..... *.... 1 1 1 1 3 5 5 ...** *.**. ..... ..... *.... 2 1 1 1 3
no yes
题目大意:给一个迷宫,给2个点,迷宫只有墙和空地,求两点之间所有路径中拐弯次数最少的次数,与给定k比较。
题目分析:水bfs。奇怪当年写了好久,交了十几次也没过,今天随便写一下就过了。。。
输入小心一点,题目看清一点,水题一枚。
详情请见代码:
#include <iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N = 105; const int M = 1000005; const int INF = 0x3f3f3f3f; char map[N][N]; int step[N][N]; int dx[] = {1,-1,0,0}; int dy[] = {0,0,1,-1}; struct node { int x,y,turn; }lcm[M],ss,now; int m,n; int si,sj,ei,ej; int k; bool isok(int x,int y) { return (x >= 0 && y >= 0 && x < n && y < m); } void bfs() { int head,tail; head = tail = 0; memset(step,INF,sizeof(step)); ss.x = si;ss.y = sj;ss.turn = -1; step[si][sj] = 0; lcm[tail ++] = ss; while(head != tail) { now = lcm[head ++]; if(head >= M) head -= M; for(int i = 0;i < 4;i ++) { ss = now; ss.turn ++; int tx = ss.x + dx[i]; int ty = ss.y + dy[i]; while(isok(tx,ty) && map[tx][ty] != '*') { if(step[tx][ty] > ss.turn) { step[tx][ty] = ss.turn; ss.x = tx; ss.y = ty; lcm[tail ++] = ss; if(tail >= M) tail -= M; } tx += dx[i]; ty += dy[i]; } } } if(step[ei][ej] <= k) puts("yes"); else puts("no"); } int main() { int i,j,t; scanf("%d",&t); while(t --) { scanf("%d%d",&n,&m); for(i = 0;i < n;i ++) scanf("%s",map[i]); scanf("%d%d%d%d%d",&k,&sj,&si,&ej,&ei); si --;sj --;ei --;ej --; if(si == ei && sj == ej) { puts("yes"); continue; } bfs(); } return 0; } //31MS 424K