逃离迷宫 hdu 1728
2014-11-25 15:35
344 查看
逃离迷宫
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 16060 Accepted Submission(s): 3923
Problem Description
给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
Input
第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表示gloria最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。
Output
每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
Sample Input
2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3
Sample Output
no
yes
#include<iostream> #include<cstring> #include<queue> using namespace std; const int MAX = 110; char map[MAX][MAX]; int vis[MAX][MAX]; int m,n,flag; int k,s_x,s_y,e_x,e_y; int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; struct node{ int x,y; int num; //当前转弯数 int dir; //记录方向 }s_pos; bool cheak(int x,int y) { if(x>=0&&x<m&&y>=0&&y<n&&map[x][y]!='*') return true; return false; } void bfs(){ s_pos.x=s_x,s_pos.y=s_y; s_pos.num=-1; s_pos.dir=-1; vis[s_x][s_y]=0; queue<node>q; q.push(s_pos); while(!q.empty()) { node now = q.front(); q.pop(); if(now.x==e_x&&now.y==e_y&&now.num<=k){ flag=1; return; } for(int i=0;i<4;i++) { node next = now; next.x+=dir[i][0], next.y+=dir[i][1]; if(cheak(next.x,next.y)) { if(next.dir==-1) //刚开始第一步时候 { next.dir=i; //dir表示direction 就是方向,有1,2,3,4分别代表 上下左右 next.num=0; //num表示当前弯数 if(vis[next.x][next.y]>=next.num) //将上下左右的点的弯数记录为当前位置的弯数,当 //第一个位置时候,弯数一定为0 //vis[i][j]表示在i,j位置时候的弯数; { vis[next.x][next.y]=next.num; q.push(next); } } else { if(i==now.dir){ //如果当前位置时候的方向与上一步方向一致时候 if(vis[next.x][next.y]>=next.num) { vis[next.x][next.y]=next.num; q.push(next); } } else{ next.num+=1; next.dir=i; if(next.num<=k&&vis[next.x][next.y]>=next.num) { vis[next.x][next.y]=next.num; q.push(next); } } } } } } } int main(){ int t; cin>>t; while(t--){ cin>>m>>n; for(int i=0;i<m;i++) cin>>map[i]; for(int i=0;i<m;i++) for(int j=0;j<n;j++) vis[i][j]=1000000; cin>>k>>s_y>>s_x>>e_y>>e_x; s_y-=1; s_x-=1; e_y-=1; e_x-=1; flag=0; if(s_x==e_x&&s_y==e_y){ cout<<"yes"<<endl; continue; } bfs(); if(flag) cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }
相关文章推荐
- hdu 1728 逃离迷宫
- HDU-1728 逃离迷宫
- HDU 1728 逃离迷宫
- 【hdu 1728】 逃离迷宫 广搜(最少拐弯次数)
- HDU - 1728 - 逃离迷宫(dfs)
- HDU 1728逃离迷宫(DFS或者BFS)
- hdu(1728)逃离迷宫
- HDU-1728 逃离迷宫(DFS)
- HDU 1728 逃离迷宫
- HDU 1728 逃离迷宫 BFS(加转弯数)
- hdu 1728 逃离迷宫 (bfs+循环队列)
- hdu 1728:逃离迷宫(DFS,剪枝)
- 【百WA然后AC】HDU 1728——逃离迷宫
- hdu 1728 逃离迷宫
- HDU-1728 逃离迷宫(BFS)
- hdu 1728 逃离迷宫 bfs
- HDU 1728 逃离迷宫(拐弯问题,对BFS最优解的新理解)
- hdu 1728 逃离迷宫
- HDU:1728 逃离迷宫
- hdu 1728 逃离迷宫 (BFS)