专题一C马的遍历

文章介绍了一种利用BFS(宽度优先搜索)算法解决马在棋盘上移动的最短步数问题。通过建立队列存储节点,从起点开始,每次遍历所有可能的下一步,并更新步数,直到找到目标或遍历完所有可达节点。提供的C++代码示例展示了如何实现这一过程。
摘要由CSDN通过智能技术生成
题目链接:

马的遍历

思路

典型的BFS题目。

BFS 全称是 Breadth First Search,中文名是宽度优先搜索,也叫广度优先搜索。

所谓宽度优先。就是每次都尝试访问同一层的节点。 如果同一层都访问完了,再访问下一层。

这样做的结果是,BFS 算法找到的路径是从起点开始的 最短 合法路径。换言之,这条路径所包含的边数最小

首先我们构建一个队列(就是我们要处理的点放在一起,用结构体储存位置和步数),第一个放进去的点自然是我们的起点,然后我们从起点开始,把起点下一步可以走的点全部放入队列,然后把点标记为已经走过,不用再走。然后就重复取点,标记操作,直到队列没有新的点。

代码如下
#include <stdio.h>
#include <string.h>

struct node {
    int x, y, step;
} que[444 * 444];
int x_0, y_0;
int vis[555][555];//判断是否踩过
int pa[555][555];//记录最少步数;
int n, m;

int ne[8][2] = {-2, -1, -2, 1, -1, -2, -1, 2, 1, -2, 1, 2, 2, -1, 2, 1}; //马的8个方向

void bfs() {
    int i, j, head = 0;
    int tail = -1;
    que[++tail].x = x_0;//添加进入第一个点
    que[tail].y = y_0;
    que[tail].step = 0;
    while (tail >= head) {//检查是否有新的点
        struct node temp = que[head++];
        for (i = 0; i < 8; i++) {//遍历八个可以去的点
            int tx = temp.x + ne[i][0];
            int ty = temp.y + ne[i][1];
            if (vis[tx][ty] || tx < 1 || tx > n || ty < 1 || ty > m)//如果不符合条件就跳过
                continue;
            que[++tail].x = tx;//将符合的点添加进入队列
            que[tail].y = ty;
            que[tail].step = temp.step + 1;
            vis[tx][ty] = 1;//标记此点已经踩过,不用再踩
            pa[tx][ty] = que[tail].step;
        }
    }
}
int main() {
    int i, j;
    memset(vis, 0, 555 * 555);
    memset(pa, -1, 555 * 555);
    scanf("%d%d%d%d", &n, &m, &x_0, &y_0);
    vis[x_0][y_0] = 1;
    pa[x_0][y_0] = 0;
    bfs();
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= m; j++) {
            if (j != m)
                printf("%-5d", pa[i][j]);
            else
                printf("%d\n", pa[i][j]);
        }
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值