马的遍历题解

这里附上题目链接:马的遍历

							~~手动分割~~ 

题目

在这里插入图片描述

解法

1.BFS

AC代码:

#include <stdio.h>
#include <stdlib.h>

int n,m;//棋盘有n行m列
int board[401][401],visit[401][401];//board为棋盘,visit用于标记棋格是否被访问
int location[8][2]={{1,2},{2,1},{1,-2},{2,-1},{-1,2},{-1,-2},{-2,1},{-2,-1}};//8个方位

struct box
{
    int x,y;//行列坐标
    int step;//step表示从马的出发点走到该格的步数
}queue[200000];

int check(int x,int y)
{
    if(x<1||x>n||y<1||y>m)//若坐标越界
    {
        return 0;
    }
    return 1;
}

int BFS(int horse_x,int horse_y)
{
    int x,y;
    int i,head=0,tail=0;//定义队首、队尾
    queue[tail].x=horse_x;
    queue[tail].y=horse_y;
    queue[tail].step=1;
    visit[horse_x][horse_y]=1;//将马初始时所在的棋格标记为已访问
    board[horse_x][horse_y]+=queue[head].step;
    tail++;
    while(head<tail)
    {
        for(i=0;i<8;i++)
        {
            x=queue[head].x+location[i][0];
            y=queue[head].y+location[i][1];
            if(check(x,y))//若坐标未越界
            {
                if(visit[x][y])//若棋格已访问
                {
                    continue;
                }
                visit[x][y]=1;//将当前棋格标记为已访问
                //新结点入队
                queue[tail].x=x;
                queue[tail].y=y;
                queue[tail].step=queue[head].step+1;
                board[x][y]+=queue[tail].step;
                tail++;
            }
        }
        head++;
    }
    return 0;
}

int main()
{
    int i,j,horse_x,horse_y;
    //输入数据
    scanf("%d%d%d%d",&n,&m,&horse_x,&horse_y);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            board[i][j]=-1;
        }
    }
    //广搜
    BFS(horse_x,horse_y);
    //输出结果
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            printf("%-5d",board[i][j]);
        }
        printf("\n");
    }
    return 0;
}

在这里插入图片描述

2.DFS

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值