标签:
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1728
题目大意:
有一个M*N的矩阵迷宫。其中,字符‘.‘表示此处为空地,字符‘*‘表示此处为障碍。在迷宫中,只能向
相邻的上、下、左、右方向走。而且在走的时候,转弯最多不能超过k次。给你初始位置(x1,y1),终
止位置(x2,y2),问:是否能从初始位置走到终止位置。
思路:
建立一个结构体,结构体中(x,y)表示当前位置,t表示目前的转弯次数。搜索四个方向,并记录下转弯
数,如果转弯数大于或等于k,则继续另外的搜索。直到搜索到终止位置,返回1。如果最后也没有搜到,
返回0。
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<queue> using namespace std; int Dire[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; char Map[110][110]; int N,M,x1,y1,x2,y2,k,vis[110][110]; struct Node { int x,y; int t; }; bool BFS() { memset(vis,0,sizeof(vis)); queue<Node> Q; Node p,q; p.x = x1; p.y = y1; p.t = -1; vis[x1][y1] = 1; Q.push(p); while( !Q.empty() ) { p = Q.front(); Q.pop(); if(p.t >= k) continue; for(int i = 0; i < 4; ++i) { q.x = p.x + Dire[i][0]; q.y = p.y + Dire[i][1]; q.t = p.t + 1; while(1) { if(q.x < 0 || q.x >= M || q.y < 0 || q.y >= N) break; if(Map[q.x][q.y]=='*') break; if(q.x == x2 && q.y == y2) return true; if( !vis[q.x][q.y] ) { Q.push(q); vis[q.x][q.y] = 1; } q.x += Dire[i][0]; q.y += Dire[i][1]; } } } return false; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&M,&N); for(int i = 0; i < M; ++i) scanf("%s",Map[i]); scanf("%d%d%d%d%d",&k,&x1,&y1,&x2,&y2); x1--,y1--,x2--,y2--; swap(x1,y1); swap(x2,y2); if(BFS()) printf("yes\n"); else printf("no\n"); } return 0; }
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/44893003