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;
    }
}


相关文章
|
7月前
|
JavaScript
Node fs 创建多层文件夹
Node fs 创建多层文件夹
56 0
|
C语言 C++
【DFS练习】素数环
【DFS练习】素数环
116 0
|
定位技术
DFS:踏青
DFS:踏青
【DFS】模板及其应用
【DFS】模板及其应用
79 0
|
Java
HDFS 自定义实现函数将文件追加到末尾的问题:
HDFS 自定义实现函数将文件追加到末尾的问题:
192 0
HDFS 自定义实现函数将文件追加到末尾的问题:
dfs
题目描述 你有一张某海域NxN像素的照片,"."表示海洋、"#"表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. ....... 其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。 由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。 例如上图中的海域未来会变成如下样子: ....... ....... ....... ....... ....#.. ......
计蒜客-1217 马走日(dfs)
马在中国象棋以日字形规则移动。
214 0
|
存储 缓存 C++
DFS(一)
.是求路径条数,还是路径本身(或动作序列)? DFS最常见的三个问题,求可行解的总数,求一个可行解,求所有可行解。 (a)如果是路径条数,则不需要存储路径
109 0
|
并行计算
Fliptile(枚举+DFS)
Problem Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk.
1217 0

热门文章

最新文章