马的遍历题解

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

							~~手动分割~~ 

题目

在这里插入图片描述

解法

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

发布了13 篇原创文章 · 获赞 0 · 访问量 247

猜你喜欢

转载自blog.csdn.net/ZhuhaoNan134/article/details/105243637