逃离迷宫之转弯问题。
来源:互联网 发布:拉格朗日中值定理 知乎 编辑:程序博客网 时间:2024/04/30 12:37
逃离迷宫
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
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, y 1, x 2, y 2 (1 ≤ k ≤ 10, 1 ≤ x 1, x 2 ≤ n, 1 ≤ y 1, y 2 ≤ m),其中k表示gloria最多能转的弯数,(x1, y 1), (x 2, y 2)表示两个位置,其中x 1,x2对应列,y 1, y 2对应行。
Output
每组测试数据对应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”,否则输出“no”。
Sample Input
25 5...***.**...........*....1 1 1 1 35 5...***.**...........*....2 1 1 1 3
Sample Output
noyes
分析:我们特别要注意.x对应列。y对应着行。我想粗心的同学应该会看错。之后一直WA。其实我也是被这个坑了。所以给大家警示以下。
我们可以这样分析。我们从起始点开始,在他往上下左右四个地方走的时候,我们不能认为转弯,所以可以另刚开始的时候,转弯次数为-1,当选定了一个方向的时候,就另那一排的转弯次数都为0,知道遇到墙或者出界为止。例如,开始转弯次数为-1,当像上走的时候,我们把像上的转弯次数都是0,当再次转弯的时候,例如像左转,就一直向左走,把他们标记为转弯次数为1。如图。
我想大家可能还是不太理解。因为当初理解这个的时候也话了特别久的时间。那下面我们来看看代码。细细领悟
我们可以这样分析。我们从起始点开始,在他往上下左右四个地方走的时候,我们不能认为转弯,所以可以另刚开始的时候,转弯次数为-1,当选定了一个方向的时候,就另那一排的转弯次数都为0,知道遇到墙或者出界为止。例如,开始转弯次数为-1,当像上走的时候,我们把像上的转弯次数都是0,当再次转弯的时候,例如像左转,就一直向左走,把他们标记为转弯次数为1。如图。
我想大家可能还是不太理解。因为当初理解这个的时候也话了特别久的时间。那下面我们来看看代码。细细领悟
//author QJS;//First Edit Time:2014-08-04 15:59//Last Edit Time:2014-08-04 15:59#include <stdio.h>#include <stdlib.h>#include <string.h>#include <queue>using namespace std;const int SIZE = 110;const int dx[] = {1, -1, 0, 0};const int dy[] = {0, 0, -1, 1};char map1[SIZE][SIZE];int vis[SIZE][SIZE];int ex, ey, bx, by;int m, n, limit;struct node{ int x, y; int step;};queue<node> q;int check(int x, int y){ if(x >= 1 && y >= 1 && x <= m && y <= n && map1[x][y] != '*') return 1; return 0;}void init()//对两个数据进行初始化{ memset(vis, 0, sizeof(vis)); memset(map1, 0, sizeof(map1)); while(!q.empty()) q.pop();} void bfs(int bx, int by){ if(bx == ex && by == ey) { printf("yes\n"); return ; } vis[bx][by] = 1; node in, out; in.x = bx; in.y = by; in.step = -1; q.push(in); while(!q.empty()) { out = q.front(); q.pop(); int x = out.x; int y = out.y; for(int i = 0; i < 4; i++) { int xx = x + dx[i]; int yy = y + dy[i]; while(check(xx, yy)) { if(!vis[xx][yy]) { in.x = xx; in.y = yy; in.step = out.step+1; q.push(in); vis[xx][yy] = 1; if(xx == ex && yy == ey && in.step <= limit) //注意,判断条件是在这里。 { printf("yes\n"); return ; } } xx += dx[i];//如果没有越界和遇到墙。我们就一直走,把那一条线都标记转弯的次数 yy += dy[i]; } } } printf("no\n"); return; }int main(){ int T; scanf("%d", &T); while(T--) { init(); scanf("%d %d", &m, &n); getchar(); for(int i = 1; i <= m; i++) { for(int j = 1; j <= n; j++) //从1开始的,不能用字符串输入。 { scanf("%c", &map1[i][j]); } getchar(); } scanf("%d%d%d%d%d", &limit, &by, &bx, &ey, &ex); bfs(bx, by); } return 0;}谢谢大家观看!!有什么宝贵的意见,请下下方评论给出。
0 0
- 逃离迷宫之转弯问题。
- HDOJ-1728 逃离迷宫(BFS + 转弯)
- hdu 1728 逃离迷宫(最小转弯)
- BFS hdu 1728 逃离迷宫 转弯数
- HDU 1728 逃离迷宫(BFS+转弯次数+转弯方向)
- HDU 1728 逃离迷宫 BFS(加转弯数)
- hdu 1728 逃离迷宫 注意标记转弯次数的方法
- HDU 1728 逃离迷宫 DFS+标记转弯数+优化
- hdoj 1728 逃离迷宫 【BFS 记录转弯次数】
- HDU 1728 逃离迷宫 bfs 限制k次转弯
- hdu 1728 逃离迷宫 (DFS+转弯数剪枝)
- 深搜之转弯问题
- 逃离迷宫
- 逃离迷宫
- 逃离迷宫
- 逃离迷宫
- 逃离迷宫
- 逃离迷宫
- hdu 3127二维费用背包
- 数字在排序数组中出现的次数
- Hardwood Species(STL)
- Oracle 查找重复数据,删除重复数据只保留一项
- mysql错误总结(1): Packet for query is too large
- 逃离迷宫之转弯问题。
- 使用 jdk Proxy 生成动态代理
- 杭电acm1014 hdu-acm-1014解题报告
- 从1.5K到18K 一个程序员的5年成长之路
- 用户主动关闭浏览器后,服务器端是否终止运行代码?
- Android系统init.rc分析
- 数据的质量
- IOS越狱开发简单流程
- 【总结】学生信息管理系统问题总结(二)