HDU1728 逃离迷宫 BFS

来源:互联网 发布:淘宝邀请的活动好不好 编辑:程序博客网 时间:2024/05/21 17:35

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1728

逃离迷宫

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 27250    Accepted Submission(s): 6658


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
25 5...***.**...........*....1 1 1 1 35 5...***.**...........*....2 1 1 1 3
 

Sample Output
noyes
 

#include <iostream>#include <cstring>#include <queue>using namespace std;typedef pair<int, int> P;typedef pair<pair<int, int>, int> Pair;// pair((横坐标x, 纵坐标y), 转弯次数k) ——转弯次数初值为题目给定,每转弯一次,k就减一,当k减为负时就该退出bfs了const int MAXN = 107;const int INF = 0x7FFFFFFF;char maze[MAXN][MAXN];//标记该位置是否被访问bool vis[MAXN][MAXN];//转弯次数,起点横坐标,起点纵坐标,终点横坐标,终点纵坐标int k, start_x, start_y, end_x, end_y;int d[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};void bfs(int m, int n){    queue<Pair> q;    q.push(Pair(P(start_x - 1, start_y - 1), k));    vis[start_x - 1][start_y - 1] = true;    while(!q.empty()){        Pair top = q.front();        q.pop();        //如果转弯次数超过限制就break(期间队头可能不是终点,但终点一定包含在队列里面)        if(top.second < 0)            break;        for(int i = 0; i < 4; i++){            int nx = top.first.first + d[i][0], ny = top.first.second + d[i][1];            //不撞南墙不回头!            while(0 <= nx && nx < m && 0 <= ny && ny < n && maze[nx][ny] == '.'){                if(!vis[nx][ny]){                    vis[nx][ny] = true;                    q.push(Pair(P(nx, ny), top.second - 1));                }                //一直向前                nx += d[i][0], ny += + d[i][1];            }        }    }}int main(){    cin.tie(0);    cout.tie(0);    int T;    cin >> T;    while(T--){        int m, n;        cin >> m >> n;        memset(vis, 0, sizeof(vis));        for(int i = 0; i < m; i++)            for(int j = 0; j < n; j++)                cin >> maze[i][j];        cin >> k >> start_y >> start_x >> end_y >> end_x;        bfs(m, n);        cout << (vis[end_x - 1][end_y - 1] ? "yes" : "no") << endl;    }}


原创粉丝点击