洛谷P1443 DFS/BFS双做法(全部AC)

洛谷P1443 DFS/BFS双做法

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照,各位码农请放心使用:
DFS解法AC截图
BFS的AC照,各位码农请放心使用:
BFS写法AC截图
最后,欢迎大家关注我的公众号《跟Matthew学编程》,拜了个拜!
(各位dalao们务必留个一键三连,在下磕头致谢!!!)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值