zoukankan      html  css  js  c++  java
  • 深度优先搜索-迷宫问题(走迷宫题解)

    题目描述

    你正在玩一个迷宫游戏,迷宫有 n×n 格,每一格有一个数字 0 或 1,可以从某一格移动到相邻四格中的一格上。为了消磨时间,你改变了玩法,只许从 0 走到 1 或者从 1 走到 0。
    现在给你一个起点,请你计算从这个格子出发最多能移动多少个格子(包含自身)。

    输入格式:
    第1行包含两个正整数 n 和 m(1≤n≤1000,1≤m≤10000)。
    接下来 n 行,对应迷宫中的 n 行,每行 n 个字符,字符为 0 或者 1,字符之间没有空格。
    接下来 m 行,表示 m 次询问。每行 2 个正整数 i,j,表示从迷宫中第 i 行第 j 列的格子开始走。

    输出格式:
    输出共 m 行,每行一个整数,分别对应于输入数据中的 m 次询问,给出最多能移动的格子数。

    完整代码

    #include<stdio.h>
    #include<string.h>
    
    int n;
    int x[1020][1020], ans[10020];
    char c[1020][1020];
    
    void dfs(int a, int b, int flag, int i) {
    	if (a == 0 || a == n + 1 || b == 0 || b == n + 1 || 
        	x[a][b] != -1 || c[a][b] - '0' != flag) {
    		return;
    	}/*搜索达到深度 或 已搜索 或 不满足1、0条件*/
    	x[a][b] = i;
    	ans[i]++;
    	dfs(a - 1, b, !flag, i);
    	dfs(a + 1, b, !flag, i);
    	dfs(a, b - 1, !flag, i);
    	dfs(a, b + 1, !flag, i);
    }
    
    int main()
    {
    	int m, i, j, a, b;
    	scanf("%d%d", &n, &m);
    	memset(x, -1, sizeof(x));
    	for (i = 1; i <= n; i++) {
    		getchar();
    		for (j = 1; j <= n; j++) {
    			scanf("%c", &c[i][j]);
    		}
    	}
    	for (i = 1; i <= m; i++) {
    		scanf("%d%d", &a, &b);
    		if (x[a][b] == -1) {
    			dfs(a, b, c[a][b] - '0', i);
    		}/*未搜索*/
    		else {
    			ans[i] = ans[x[a][b]];
    		}/*已搜索*/
    		printf("%d
    ", ans[i]);
    	}
    	return 0;
    }
  • 相关阅读:
    UIScrollerView遇到UINavigationController
    iOS 自动化打包
    最最基本的SQL常用命令
    导入样式表与外部样式表的区别
    jdk、jre、JVM的简单区别与联系
    JDBC驱动的四种类型
    将映射中的值进行排序并输出键
    Java优先级队列
    Java线程池
    Callable--创建有返回值的线程
  • 原文地址:https://www.cnblogs.com/dump16/p/12539960.html
Copyright © 2011-2022 走看看