走迷宫(二):在XX限制条件下,是否走得出
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728
解题方法:BFS+访问数组vis[][];
给你起点位置和终点位置,让你判断能不能到达,并且拐弯数不能超过某个值。
#include<iostream> #include<stdio.h> #include<algorithm> #include<queue> using namespace std; //int dx[]={0,0,-1,1}; //int dy[]={1,-1,0,0}; int dir[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 }; char map[101][101]; int vis[101][101]; int m,n; int k; struct point { int x; int y; int kk; }; void bfs(point s,point u) { int flag=0; point q,p; s.kk=-1; //(新增)-1,不是0 vis[s.x][s.y]=1; //(新增)访问的标志 queue<point>tp; tp.push(s); while(!tp.empty ()) { q=tp.front(); tp.pop(); if(q.x==u.x&&q.y==u.y&&q.kk<=k) //(新增)q.kk<=k { flag=1; break; } int i; p.kk=q.kk+1; //(新增) for(i=0;i<4;i++) { p.x=q.x+dir[i][0];//p.x=q.x+dx[i]; p.y=q.y+dir[i][1];//p.y=q.y+dy[i]; while(p.x>=0&&p.x<m&&p.y>=0&&p.y<n&&map[p.x][p.y]!='*') //(新增)搜索完一个方向 { if(!vis[p.x][p.y]) { vis[p.x][p.y]=1; tp.push(p); } p.x+=dir[i][0];//p.x+=dx[i]; //(新增) p.y+=dir[i][1];//p.y+=dy[i]; //(新增) } } } if(flag) { cout<<"yes\n"; } else { cout<<"no\n"; } } int main() { int t; cin>>t; while(t--) { cin>>m>>n; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { cin>>map[i][j]; } } point s,u; cin>>k>>s.y>>s.x>>u.y>>u.x; s.y--;s.x--;u.y--;u.x--; memset(vis,0,sizeof(vis)); //(新增)初始化访问标志的数组 bfs(s,u); } }
相关链接:http://blog.csdn.net/zhuhuangjian/article/details/8262561