P1443 马的遍历

(兴趣是最好的老师!!!)
在这里插入图片描述

//广度优先搜索入门(bfs) 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
struct xy {
	int x, y;
}node, Top;
const int dx[4] = { 1,-1,2,-2 };
const int dy[4] = { 1,-1,2,-2 };
int a[401][401];//到(x,y)处的步数 
bool b[401][401];
int n, m;
void bfs(int x, int y, int step) {
	a[x][y] = step;
	b[x][y] = false;//将开始的节点设置为已经访问
	queue<xy> Q;//创建一个基于结构 xy 的队列Q 
	node.x = x;
	node.y = y;
	Q.push(node);//node 入队 
	while (!Q.empty()) {
		Top = Q.front();//记录队列首个元素(先进先出) 
		Q.pop();//弹出队列(先进先出)
		for (int i = 0;i < 4;i++) {
			for (int j = 0;j < 4;j++) {
				if (abs(dx[i]) != abs(dy[j])) {//马走日的条件 
					int NewX = Top.x + dx[i];
					int NewY = Top.y + dy[j];//来到新位置 
					if (NewX<1 || NewY<1 || NewY>m || NewX>n) continue;//新的位置不可以出界 
					if (b[NewX][NewY]) {//如果新位置未被访问过 
						node.x = NewX;
						node.y = NewY;
						Q.push(node);//逐层压入需要判断的坐标(bfs思想) 
						b[NewX][NewY] = false;//记录被访问过了 
						a[NewX][NewY] = a[Top.x][Top.y] + 1;//步数加一 
					}
				}
			}
		}
	}
}
int main() {
	memset(b, true, sizeof(b));
	memset(a, -1, sizeof(a));
	int x, y;
	cin >> n >> m >> x >> y;
	bfs(x, y, 0);
	for (int i = 1;i <= n;i++) {
		for (int j = 1;j <= m;j++) {
			printf("%-5d", a[i][j]);//左对齐五格输出 
		}
		cout << endl;
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值