矩阵dfs--走回路

矩阵dfs 走回路 的问题(最后没有在回走---Corner case), 先想好算法, 再自己画图走一遍试试, 递归出口, 注意 corner case, 什么时候符合题意, 什么时候往里面加元素, 边走边看需要 什么工具,

工具: map(方向), 结果容器, visited, 辅助容器或变量

class Demo {
    List<String> curPath = new ArrayList<>();
    int[][] dirs = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } };
    private final Map<Integer, String> dirMap = new HashMap<>();
    String[] dict = new String[]{"up", "right", "down", "left"};
    private int count;

    public List<String> findPath(char[][] maze, int x, int y) {

        int m = maze.length;
        int n = maze[0].length;
        count = 0;

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (maze[i][j] == ‘T‘) {
                    count++;
                }
            }
        }

        boolean[][] visited = new boolean[m][n];
        dfs(maze, x, y, visited);

        return count == 0 ? curPath : new ArrayList<>();
    }

    private void dfs(char[][] maze, int x, int y, boolean[][] visited ) {
        if (maze[x][y] != ‘T‘ ) {
            return;
        }
        int m = maze.length;
        int n = maze[0].length;
        visited[x][y] = true;
        count--;

        for (int i = 0; i < 4; i++) {
            int xx = x + dirs[i][0];
            int yy = y + dirs[i][1];

            if (xx < 0 || xx >= m || yy < 0 || yy >= n || visited[xx][yy] || maze[xx][yy] == ‘F‘) {
                continue;
            }
            curPath.add(dict[i]);

            //curPath.add(dirMap.get(i)); // 为啥用map老是 空指针异常啊???
            dfs(maze, xx, yy, visited);
            if (count != 0) {
                curPath.add(dict[(i + 2) % 4]); // 回路
            }

        }

    }
}
public class Robot {

    public static void main(String[] args) {
        Demo r = new Demo();
        char[][] maze = {
                {‘T‘, ‘T‘, ‘T‘, ‘F‘},
                {‘F‘, ‘T‘, ‘F‘, ‘T‘},
                {‘F‘, ‘T‘, ‘T‘, ‘F‘}
        };

        List<String> res = r.findPath(maze, 1, 1);
        System.out.println(String.join(" ", res));
    }
}

  

时间: 2024-10-10 19:59:36

矩阵dfs--走回路的相关文章

hdu 1010 dfs 走到终点时刚好花掉所有时间 奇偶性剪枝

题意:输入一个n*m的迷宫,和一个T:可以在迷宫中生存的最大时间.S为起点,D为终点.并且,每个格子只能踩一次,且只能维持一秒,然后该块地板就会塌陷.所以你必须每秒走一步,且到D点时,所用时间为T.用深搜.奇偶性剪枝:如果当前的狗所在的坐标与D的坐标奇偶性不一样,那么狗需要走奇数步.同理,如果狗所在坐标与D的坐标奇偶性一样,那么狗需要走偶数步数. 也就是说,狗的坐标x.y和对2取余是它的奇偶性,Dxy和对2取余是D的奇偶性.两个奇偶性一加再对2取余,拿这个余数去与剩下时间对2取余的余数作比较即可

4500: 矩阵 dfs

表质疑,一个dfs就可以了.首先该题是个判定性问题.又因为这道题有点像查分约束,应该可以证明如果存在的话方案数应该是无穷的(凭蒟蒻的感觉).而且可以任意指定一个点的值的大小,判断其他的值是否满足.实现起来有点像TWO-SAT.大概就这样.加油!有时间的话还要再回来想一下. 想了一下如果要求输出一个方案的话,还要跑有上下限的网络流,具体是S集点 i 往T集点 j 连上下限均为V(i,j)的边. 1 #include<cstdio> 2 #include<iostream> 3 #de

深度优先dfs与广度bfs优先搜索总结+例题

DFS(Deep First Search)深度优先搜索 深度优先遍历(dfs)是对一个连通图进行遍历的算法.它的思想是从一个顶点开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 简而言之:不撞南墙不回头 模板如下: void dfs(int t)//t代表目前dfs的深度 { if(满足输出条件||走不下去了) { 输出解; return; } else { for(int i=1;i<=尝试方法数;

540C: Ice Cave

题目链接 题意: n*m的地图,'X'表示有裂痕的冰块,'.'表示完整的冰块,有裂痕的冰块再被踩一次就会碎掉,完整的冰块被踩一次会变成有裂痕的冰块, 现在告诉起点和终点,问从起点能否走到终点并且使终点的冰块碎掉.不能原地跳.起点和终点可能会在同一个位置. 解题思路: 在只走'.'的情况下把终点的冰踩碎   输入n*m的矩阵 以及走的开始和终点位置 在开始点,上下左右找'.',有就走,并把改点设置为'X',走到终点时候,若终点是'X'则成功. 其他情况都失败.   这个程序是在codeforces

用BFS解决迷宫问题

在一个n*n的矩阵里走,从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走,求最短步数.n*n是01矩阵,0代表该格子没有障碍,为1表示有障碍物. int mazeArr[maxn][maxn]; //表示的是01矩阵 int stepArr[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; //表示上下左右4个方向 int visit[maxn][maxn]; //表示该点是否被访问过,防止回溯,回溯很耗时. 解题思路: BFS

踩方格

踩方格 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1196 时间限制: 1000 ms         内存限制: 65536 KB提交数: 139     通过数: 93 [题目描述] 有一个方格矩阵,矩阵边界在无穷远处.我们做如下假设: a.每走一步时,只能从当前方格移动一格,走到某个相邻的方格上: b.走过的格子立即塌陷无法再走第二次: c.只能向北.东.西三个方向走: 请问:如果允许在方格矩阵上走n步,共有多少种不同的方案.2种走

2016. 4.10 NOI codevs 动态规划练习

1.codevs1040 统计单词个数 1040 统计单词个数 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠.当选用一个单词之后,其第一个字母不能再用.例如字符串t

代码与算法集锦-归并排序+树状数组+快排+深度优先搜索+01背包(动态规划)

归并排序 求逆序数 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 首先考虑下如何将将二个有序数列合并.这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数.然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可. //将有序数组a[]和b[]合并到c[]中 void MemeryArray(int a[], int n, int b[], int m, int c

我要好offer之 搜索算法大总结

1. 二分搜索 详见笔者博文:二分搜索的那些事儿,非常全面 2. 矩阵二分搜索 (1) 矩阵每行递增,且下一行第一个元素大于上一个最后一个元素 (2) 矩阵每行递增,且每列也递增 3. DFS 深度优先搜索 适用场景: (1) 输入数据:如果是 递归数据结构(如单链表.二叉树),则一定可以使用DFS (2) 求解目标:必须走到最深处(例如二叉树,必须走到叶子节点)才能得到一个解,这种情况一般适合用DFS 思考步骤: (1) DFS最常见的3个问题:求可行解的总数.求任一个可行解.求所有可行解 (