DFS
dfs的做法网上很多dalao们都说玩写不起,但是多亏了一位dashen的帮助,最后写通了dfs。先上代码(各位想抄代码的朋友们看到这个就OK了):
#include <bits/stdc++.h>
using namespace std;
//const int maxn = (4e2 + 8);
int a[maxn][maxn], n, m, sx, sy;
int nt[8][2] = {{1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}, {-2, -1}, {-2, 1}, {-1, 2}};
void dfs(int nx, int ny, int step) {
if((step > 267) || (step >= a[nx][ny]))
return;
a[nx][ny] = step;
for(int i = 0; i < 8; i ++) {
int tx = (nx + nt[i][0]);
int ty = (ny + nt[i][1]);
if((tx < 1) || (ty < 1) || (tx > n) || (ty > m))
continue;
dfs(tx, ty, step + 1);
}
return;
}
int main() {
memset(a, 0x3f, sizeof(a));
cin >> n >> m >> sx >> sy;
dfs(sx, sy, 0);
for(int i = 1; i <= n; i ++) {
for(int j = 1; j <= m; j ++)
printf("%-5d", ((a[i][j] == 0x3f3f3f3f) ? -1 : a[i][j]));
printf("\n");
}
return 0;
}
memset不知道的可以问问度娘,主要看dfs。重点就在step > 267这个数字上。还有旁边的>=也特别坑,你没有=变成>,好嘛,时间一下子满了1倍。这个267是怎么的来的呢?这是用我之前编写的宽搜代码求出最大步数编进去的,用400 400 1 1测试的,最大步数就在这。这样一个剪枝就行了,直接过关,吊打了“dfs过不了这一题”的传说 谣言。
BFS
bfs是网上各位dalao普遍用的思路,就是用一个bfs,bfs有个特点是“先入为少”,也就是第一个搜到的数就是最短的,一遍就够,时间复杂度也低,是个不错不错真不错的算法。
//#include <bits/stdc++.h>
using namespace std;
const int maxn = (4e2 + 8);
int a[maxn][maxn], n, m, sx, sy, tx, ty;
bool book[maxn][maxn];
struct node {
int x, y, step;
node(int _x = 0, int _y = 0, int _step = 0) {
x = _x;
y = _y;
step = _step;
}
} f;
queue<node> que;
int nt[8][2] = {{1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}, {-2, -1}, {-2, 1}, {-1, 2}};
int main() {
memset(a, -1, sizeof(a));
cin >> n >> m >> sx >> sy;
book[sx][sy] = true;
que.push(node(sx, sy, 0));
while(!que.empty()) {
f = que.front();
a[f.x][f.y] = f.step;
for(int i = 0; i < 8; i ++) {
tx = (f.x + nt[i][0]);
ty = (f.y + nt[i][1]);
if((tx < 1) || (ty < 1) || (tx > n) || (ty > m) || book[tx][ty])
continue;
book[tx][ty] = true;
que.push(node(tx, ty, f.step + 1));
}
que.pop();
}
for(int i = 1; i <= n; i ++) {
if(i - 1) cout << endl;
for(int j = 1; j <= m; j ++)
printf("%-5d", a[i][j]);
}
return 0;
}
这边弄了一个结构体,弄结构体是我的一个习惯。
最后附上两张图片:
DFS的AC照,各位码农请放心使用:
BFS的AC照,各位码农请放心使用:
最后,欢迎大家关注我的公众号《跟Matthew学编程》,拜了个拜!
(各位dalao们务必留个一键三连,在下磕头致谢!!!)