[dfs] aw1116. 马走日(dfs搜索顺序+模板题)

Posted Ypuyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[dfs] aw1116. 马走日(dfs搜索顺序+模板题)相关的知识,希望对你有一定的参考价值。

1. 题目来源

链接:1116. 马走日

2. 题目解析

模板题,注意一开始 dfs(x, y, 0, res) 是错误的,应该是 dfs(x, y, 1, res)。因为一开始起点 (x, y) 不需要进行判断,默认被搜到了,即直接被置为 st[x][y]=true

如果是 1*1 的方格,那么一进去起点就应该被判断,它是无法进行 8 方向拓展的,所以应该一进去传 1。


时间复杂度: O ( 指 数 级 ) O(指数级) O()

空间复杂度: O ( n 2 ) O(n^2) O(n2)


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 10;

int n, m, x, y;
bool st[N][N];

int dx[8] = {-1, -2, -2, -1, 1, 2, 2, 1}, dy[8] = {-2, -1, 1, 2, 2, 1, -1, -2};

void dfs(int x, int y, int cnt, int &res) {
    if (cnt == n * m) {
        res ++ ;
        return ;
    }

    st[x][y] = true;

    for (int i = 0; i < 8; i ++ ) {
        int a = x + dx[i], b = y + dy[i];
        if (a < 0 || a >= n || b < 0 || b >= m) continue;
        if (st[a][b]) continue;

        dfs(a, b, cnt + 1, res);
        
    }
    
    st[x][y] = false;       // 恢复现场
}

int main() {
    int T;
    scanf("%d", &T);

    while (T -- ) {
        scanf("%d%d%d%d", &n, &m, &x, &y);
        
        memset(st, 0, sizeof st);   // 由于有恢复现场,所以这一步可以不用做,每次 st 数组都是 0 
        int res = 0;
        dfs(x, y, 1, res);          // 这里是 1 而不是 0,当前在搜第几个点。在这出错!
        printf("%d\\n", res);
    }

    return 0;
}

以上是关于[dfs] aw1116. 马走日(dfs搜索顺序+模板题)的主要内容,如果未能解决你的问题,请参考以下文章

马走日 (DFS)

马走日的解法(dfs)

[dfs] aw1118. 分成互质组(dfs搜索顺序+dfs状态定义+最大团+好题)

[dfs] aw165. 小猫爬山(dfs剪枝与优化+好题)

[dfs] aw1117. 单词接龙(dfs搜索顺序+递归理解+好题)

Problem L: 搜索基础之马走日