[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] aw1118. 分成互质组(dfs搜索顺序+dfs状态定义+最大团+好题)
[dfs] aw165. 小猫爬山(dfs剪枝与优化+好题)