DFS题单以及模板汇总

简介: DFS题单以及模板汇总

此文章是为了记录自己学习DFS算法以及记录写过的DFS题单汇总,持续补充

迷宫

题目描述

给定一个N×M 方格的迷宫,迷宫里有 T 处障碍,障碍处不可通过。

在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。

输入格式

image.png

输出格式

输出从起点坐标到终点坐标的方案总数。

样例

样例输入

2 2 1
1 1 2 2
1 2

样例输出

1

提示

image.png

AC代码:

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Main {
    static int n;
    static int m;
    static int N = 10;
    static int T;
    static int[][] arr = new int[N][N];
    static boolean[][] vis = new boolean[N][N];
    static int[][] dir = {{1,0}, {-1,0}, {0,1}, {0,-1}};
    static int res = 0;
    static int x0;
    static int y0;
    static int x;
    static int y;
    public static void main(String[] args) throws IOException {
        Read read = new Read();
        n = read.nextInt();
        m = read.nextInt();
        T = read.nextInt();
        // (x0,y0) -> 起始点坐标
        // (x,y) -> 终点坐标
        x0 = read.nextInt();
        y0 = read.nextInt();
        x = read.nextInt();
        y = read.nextInt();
        for (int i = 1 ; i <= n; i++) {
            for (int j =  1; j <= m; j++) {
              // 赋予默认值1
                arr[i][j] = 1;
            }
        }
        for (int k = 1 ; k <= T; k++) {
          // 标记障碍物为0
            int a1 = read.nextInt();
            int a2 = read.nextInt();
            arr[a1][a2] = 0;
        }
        dfs(x0,y0);
        System.out.println(res);
    }
    public static void dfs(int i,int j) {
      // 如果到达终点退出循环
        if (i == x && j == y) {
            res++;
            return;
        } else {
          // 针对(i,j)坐标每次进行上下左右的探索
            for (int k = 0 ; k < 4; k++) {
                int dx = i + dir[k][0];
                int dy = j + dir[k][1];
                // 如果当前坐标(dx,dy)没有被访问过,且(dx,dy)是非障碍物点
                if (dx >= 1 && dx <= n && dy >= 1 && dy <= m && arr[dx][dy] == 1 && !vis[dx][dy]) {
                  // 标记(i,j)已经遍历过
                    vis[i][j] = true;
                    dfs(dx, dy);
                    // 还原(i,j)
                    vis[i][j] = false;
                }
            }
        }
    }
}
class Read {
    StreamTokenizer st = new StreamTokenizer(new InputStreamReader(System.in));
    public int nextInt() throws IOException {
        st.nextToken();
        return (int) st.nval;
    }
    public double nextDouble() throws IOException {
        st.nextToken();
        return st.nval;
    }
    public String nextString() throws IOException {
        st.nextToken();
        return st.sval;
    }
}


相关文章
|
6月前
|
机器学习/深度学习 人工智能
BFS模板
BFS模板
40 3
|
机器学习/深度学习 人工智能 定位技术
|
定位技术
DFS:踏青
DFS:踏青
【DFS】模板及其应用
【DFS】模板及其应用
76 0
|
算法
迭代加深(DFS)
复习acwing算法提高课的内容,本篇为讲解算法:迭代加深,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
143 0
迭代加深(DFS)
L2-016 愿天下有情人都是失散多年的兄妹 (25 分)(dfs)
L2-016 愿天下有情人都是失散多年的兄妹 (25 分)(dfs)
124 0
|
测试技术
7-37 整数分解为若干项之和 (20 分)(dfs)
7-37 整数分解为若干项之和 (20 分)(dfs)
257 0
dfs
题目描述 你有一张某海域NxN像素的照片,"."表示海洋、"#"表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. ....... 其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。 由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。 例如上图中的海域未来会变成如下样子: ....... ....... ....... ....... ....#.. ......