hdu 1728 逃离迷宫 [ dfs ]
2015-03-27 21:07
330 查看
传送门
Total Submission(s): 17478 Accepted Submission(s): 4247
[align=left]Problem Description[/align]
给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
[align=left]Input[/align]
第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对应行。
[align=left]Output[/align]
每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
[align=left]Sample Input[/align]
2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3
[align=left]Sample Output[/align]
no
yes
[align=left]Source[/align]
“网新恩普杯”杭州电子科技大学程序设计邀请赛
[align=left]Recommend[/align]
lcy | We have carefully selected several similar problems for you: 1253 1072 1026 1372 1180
题解:
dfs,记得用vis记录,防止重复搜索
逃离迷宫
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17478 Accepted Submission(s): 4247
[align=left]Problem Description[/align]
给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
[align=left]Input[/align]
第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对应行。
[align=left]Output[/align]
每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
[align=left]Sample Input[/align]
2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3
[align=left]Sample Output[/align]
no
yes
[align=left]Source[/align]
“网新恩普杯”杭州电子科技大学程序设计邀请赛
[align=left]Recommend[/align]
lcy | We have carefully selected several similar problems for you: 1253 1072 1026 1372 1180
题解:
dfs,记得用vis记录,防止重复搜索
13261396 | 2015-03-27 21:05:25 | Accepted | 1728 | 93MS | 4272K | 2241 B | G++ | czy |
#include <cstdio> #include <cstring> #include <stack> #include <vector> #include <map> #include <algorithm> #define ll long long int const N = 105; int const M = 205; int const inf = 1000000000; ll const mod = 1000000007; using namespace std; int T; int n,m; int k; int vis [12][5]; struct PP { int x; int y; int operator ==(const PP &b) const { if(x==b.x && y==b.y) return 1; else return 0; } }; PP st,en; char s ; int dirx[]={-1,0,1,0}; int diry[]={0,1,0,-1}; int flag; void ini() { int i,j; flag=0; scanf("%d%d",&n,&m); memset(vis,0,sizeof(vis)); for(i=0;i<=n+1;i++){ for(j=0;j<=m+1;j++){ s[i][j]='*'; } } for(i=1;i<=n;i++){ scanf("%s",s[i]+1); } scanf("%d%d%d%d%d",&k,&st.y,&st.x,&en.y,&en.x); } void dfs(PP te,int d,int num) { if(num>k){ return; } if(te==en){ flag=1;return; } int i; PP nt; for(i=0;i<4;i++){ nt.x=te.x+dirx[i]; nt.y=te.y+diry[i]; if(s[nt.x][nt.y]=='.'){ if(i==d){ if(vis[nt.x][nt.y][num][i]==1) continue; vis[nt.x][nt.y][num][i]=1; dfs(nt,i,num); } else{ if(vis[nt.x][nt.y][num+1][i]==1) continue; vis[nt.x][nt.y][num+1][i]=1; dfs(nt,i,num+1); } if(flag==1) return; } } } void solve() { int d; PP nt; if(nt==en){ flag=1;return; } for(d=0;d<4;d++){ if(flag==1) return; nt.x=st.x+dirx[d]; nt.y=st.y+diry[d]; if(s[nt.x][nt.y]=='.'){ vis[nt.x][nt.y][0][d]=1; dfs(nt,d,0); } } } void out() { if(flag==1){ printf("yes\n"); } else{ printf("no\n"); } } int main() { //freopen("data.in","r",stdin); // freopen("data.out","w",stdout); scanf("%d",&T); //for(int cnt=1;cnt<=T;cnt++) while(T--) //while(scanf("%d%d",&n,&sum)!=EOF) { ini(); solve(); out(); } }
相关文章推荐
- HDU 1728 逃离迷宫 DFS+标记转弯数+优化
- 1728 hdu 逃离迷宫(DFS)
- HDOJ/HDU 1728 逃离迷宫 DFS 深度优先搜素
- hdu 1728 逃离迷宫(DFS)+1175连连看(DFS)
- hdu 1728:逃离迷宫(DFS,剪枝)
- 搜索专题(DFS&&BFS&&剪枝)HDU 1728-逃离迷宫
- HDU 1728 逃离迷宫(DFS经典题,比赛手残写废题)
- HDU 1728逃离迷宫(简单dfs)
- HDU 1728 逃离迷宫 单方向BFS 或者DFS加剪枝
- hdu 1728 逃离迷宫(dfs)
- hdu-1728逃离迷宫(dfs 求拐弯次数)
- hdu 1728 逃离迷宫(DFS)
- hdu 1728 逃离迷宫 剪枝DFS
- hdu 1728 逃离迷宫 (DFS+转弯数剪枝)
- HDU 1728 逃离迷宫(dfs或bfs+剪枝)
- hdu 1728 逃离迷宫(dFS+优先队列)
- HDU 1728 逃离迷宫(BFS+DFS)
- HDU1728 逃离迷宫 DFS
- HDU 1728逃离迷宫(DFS或者BFS)
- hdu 1728 逃离迷宫(dFS+优先队列)