1027: 逃离迷宫
时间限制: 1 Sec 内存限制: 128 MB
提交: 611 解决: 130
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
PIPI被困在一个迷宫中了!
给定一个m × n (m行,
n列)的迷宫,迷宫中有两个位置,PIPI想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,PIPI可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,PIPI不能走到迷宫外面去。令人头痛的是,PIPI是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,PIPI所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。PIPI能从一个位置走到另外一个位置吗?
输入
第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数,接下来为t组测试数据,每组测试数据中,
第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符‘.‘表示该位置为空地,字符‘*‘表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),其中k表示PIPI最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。
输出
每组测试数据对应为一行,若PIPI能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
样例输入
2 5 5 ...** *.**. ..... ..... *.... 1 1 1 1 3 5 5 ...** *.**. ..... ..... *.... 2 1 1 1 3
样例输出
no yes
来源/分类
1 #include<iostream> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 char map[105][105]; 6 int visit[105][105]; 7 8 int m,n,k; 9 10 int dx[4]={0,0,1,-1}; 11 int dy[4]={1,-1,0,0}; 12 13 typedef struct node{ 14 int x; 15 int y; 16 int count; 17 }; 18 19 queue<node> q; 20 21 bool isCanGo(int x,int y){ 22 if(x>=1&&x<=n&&y>=1&&y<=m&&map[x][y]==‘.‘){ 23 return true; 24 } 25 return false; 26 } 27 28 void bfs(int x1,int y1,int x2,int y2){ 29 int i; 30 node pos1,pos2; 31 pos1.x=x1; 32 pos1.y=y1; 33 pos1.count=-1; 34 q.push(pos1); 35 visit[x1][y1]=1; 36 while(!q.empty()){//这里的搜索关键点在于方向的计数以及不重复遍历,广搜和深搜都可以 37 pos1=q.front(); 38 q.pop();//从起点开始出发找一个方向往前走 39 for(i=0;i<4;i++){ 40 pos2.x=pos1.x+dx[i]; 41 pos2.y=pos1.y+dy[i]; 42 while(isCanGo(pos2.x,pos2.y)){//如果该点可以到达 43 if(visit[pos2.x][pos2.y]==0){//如果没有被访问过就访问 44 visit[pos2.x][pos2.y]=1; 45 pos2.count=pos1.count+1;//并没有改变方向 ,只相比出队的点转换了一个方向 46 q.push(pos2); 47 if(pos2.x==x2&&pos2.y==y2&&pos2.count<=k){//符合要求到达最终节点 48 cout << "yes" << endl; 49 return; 50 } 51 }//继续朝这个方向走,直到走不了了再换方向 52 pos2.x+=dx[i]; 53 pos2.y+=dy[i]; 54 } 55 } 56 } 57 cout << "no" << endl; 58 return; 59 } 60 61 int main(){ 62 int x1,y1,x2,y2; 63 int t; 64 cin>>t; 65 while(t--){ 66 memset(map, 0, sizeof(map)); 67 memset(visit, 0, sizeof(visit)); 68 while (!q.empty()){ 69 q.pop(); 70 } 71 cin>>n>>m; 72 for(int i=1;i<=n;i++){ 73 for(int j=1;j<=m;j++){ 74 cin>>map[i][j]; 75 } 76 }//其中x1,x2对应列,y1, y2对应行,这里对其进行更改一下顺序 77 cin>>k>>y1>>x1>>y2>>x2; 78 if (x1 == x2 && y1 == y2) 79 cout << "yes" << endl; 80 else 81 bfs(x1,y1,x2,y2); 82 } 83 return 0; 84 }
原文地址:https://www.cnblogs.com/tangyimin/p/10566053.html