zoukankan      html  css  js  c++  java
  • ybt1215 迷宫

    ybt1215 迷宫

    【题目描述】

    一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。

    【输入】

    第1行是测试数据的组数k,后面跟着k组输入。每组测试数据的第1行是一个正整数n (1 ≤ n ≤ 100),表示迷宫的规模是n * n的。接下来是一个n * n的矩阵,矩阵中的元素为.或者#。再接下来一行是4个整数ha, la, hb, lb,描述A处在第ha行, 第la列,B处在第hb行, 第lb列。注意到ha, la, hb, lb全部是从0开始计数的。

    【输出】

    k行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。

    【输入样例】

    2 3
    .##
    ..#
    #..
    0 0 2 2
    5
    .....
    ###.#
    ..#..
    ###..
    ...#.
    0 0 4 0 
    

    【输出样例】

    YES
    NO
    

    【题解】

    这道题的思路是从起点开始分别向四个方向深搜,到最后就可以搜到所有能联通的点。只要搜到的点是终点,那么就输出“YES”,否则,将所有能到达的点都搜过一遍还是没有找到,输出“NO”。

    #include<iostream>
    #include<cstring>
    using namespace std;
    int xr[4] = { 0,1,0,-1 };
    int yr[4] = { -1,0,1,0 };//操作记录
    int x_1, x_2, y_1, y_2, T, n;
    char a;
    bool vsd[100][100], flag;
    void dfs(int x, int y) {//深搜
    	if (flag) {
    		return;
    	}
    	if ((x < 0) || (y < 0)) {
    		return;
    	}
    	if ((x >= n) || (y >= n)) {
    		return;
    	}
    	if (vsd[x][y]) {
    		return;
    	}
    	vsd[x][y] = 1;
    	if ((x == x_2) && (y == y_2)) {
    		cout << "YES" << endl;
    		flag = true;//打标记
    		return;
    	}
    	for (int i = 0; i < 4; i++) {
    			dfs(x + xr[i], y + yr[i]);
    	}
    	return;
    }
    int main() {
    	cin >> T;
    	for (int o = 1; o <= T; o++) {//多组数据
    		memset(vsd, false, sizeof(vsd));//清空数组
    		flag = false;//初始化flag
    		cin >> n;//输入矩阵大小
    		for (int i = 0; i < n; i++) {
    			for (int j = 0; j < n; j++) {
    				cin >> a;
    				if (a == '#') {
    					vsd[i][j] = 1;//禁止通行可以用已访问到等效代替
    				}
    			}
    		}
    		cin >> x_1 >> y_1 >> x_2 >> y_2;
    		if (vsd[x_1][y_1] || vsd[x_2][y_2]) {//特判起点或终点是“#”的时候
    			cout << "NO" << endl;
    			continue;
    		}
    		else {//从x_1,y_1的位置开始搜
    			dfs(x_1, y_1);
    		}
    		if (!flag) {//到最后也没有连通
    			cout << "NO" << endl;
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    二叉树专题
    强化学习的几个基本概念
    LeetCode #111 二叉树的最小深度
    NC127 最长公共子串
    快速排序
    NC78 反转链表
    《合作的进化》读后总结
    Optional和Stream的map与flatMap
    最爱的小工具,谁用谁知道!
    SpringBoot应用启动过程分析
  • 原文地址:https://www.cnblogs.com/Wild-Donkey/p/12311416.html
Copyright © 2011-2022 走看看