• HDU1728 从迷宫中逃脱 【方向BFS】


    从迷宫中逃脱

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


    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
    题意:求是否能在给定转弯次数内到达终点。

    题解:沿着一个方向走究竟。用一个数组记录转弯次数。第45行加了个剪枝。由于用的是广搜,所以第一次到达时肯定是用转弯次数最少的时候,若此时转弯次数都超了那就不用继续搜索下去了。

    时间从62ms降低到15ms。

    #include <stdio.h>
    #include <string.h>
    #include <queue>
    #define maxn 102
    using std::queue;
    
    char map[maxn][maxn];
    int steps, m, n, step[maxn][maxn];
    int mov[][2] = {1, 0, -1, 0, 0, 1, 0, -1};
    struct Node{
    	int x, y;
    	Node operator+(int i){
    		Node t;
    		t.x = x + mov[i][0];
    		t.y = y + mov[i][1];
    		return t;
    	}
    };
    
    bool check(int x, int y)
    {
    	return x < m && x >= 0 && y < n && y >= 0 
    		&& map[x][y] != '*';
    }
    
    bool BFS(int x, int y)
    {
    	if(map[x][y] == 'T') return true;
    	memset(step, -1, sizeof(step));
    	Node now, t;
    	int i;
    	now.x = x; now.y = y;
    	queue<Node> Q;
    	Q.push(now);
    	while(!Q.empty()){
    		now = Q.front(); Q.pop();
    		for(i = 0; i < 4; ++i){
    			t = now + i;
    			while(check(t.x, t.y)){
    				//保证不反复入队。可能出现路线交叉的情况
    				if(step[t.x][t.y] == -1){
    					step[t.x][t.y] = step[now.x][now.y] + 1;
    					if(map[t.x][t.y] == 'T'){
    						if(step[t.x][t.y] <= steps) return 1;
    						return 0;
    					}
    					Q.push(t);
    				}
    				t = t + i;
    			}
    		}
    	}
    	return false;
    }
    
    int main()
    {
    	int t, x1, y1, x2, y2, i;
    	scanf("%d", &t);
    	while(t--){
    		scanf("%d%d", &m, &n);
    		for(i = 0; i < m; ++i)
    			scanf("%s", map[i]);
    		scanf("%d%d%d%d%d", &steps, &y1, &x1, &y2, &x2);
    		--x1; --y1; --x2; --y2;
    		map[x2][y2] = 'T';
    		if(BFS(x1, y1)) puts("yes");
    		else puts("no");
    	}
    	return 0;
    }


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    json_encode不编码中文字符的方式
    网站备份脚本
    英语动词大全
    多线程和多进程的区别【转载网络】
    解决curl中errno为51和60的错误
    ps修改图片文字
    如何设计充值消费的数据表
    LoRa与NB-IoT对比(转载)
    vuejs 使用vue-cli引入bootstrap
    关于防火墙的规则
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4746276.html
Copyright © 2020-2023  润新知