• 深度优先搜索-迷宫问题(走迷宫题解)


    题目描述

    你正在玩一个迷宫游戏,迷宫有 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;
    }
  • 相关阅读:
    解决vs2017创建.net core失败以及不能登录问题
    ocx控件的坑
    Sqlserver 高并发和大数据存储方案
    远程连接ejabberd的mnesia数据库
    基于ejabberd实现各个客户端消息同步
    小诗一首《钗头凤·七夕夜》
    微软office web apps 服务器搭建之在线文档预览(二)
    微软office web apps 服务器搭建之在线文档预览(一)
    基于ejabberd简单实现xmpp群聊离线消息
    yiwoSDK2.0完整版
  • 原文地址:https://www.cnblogs.com/dump16/p/12539960.html
Copyright © 2020-2023  润新知