鹿我所录的博客

记录我在学习C#中的点点滴滴,记录下以备后来人借鉴。

 

洛谷P1443马的遍历-题解

原题:

 

 

思路:

 

广搜。

但队列除了记忆坐标,还要记忆步数。

在将一个点入队的时候,这个点的步数为这个点的父亲节点的步数+1,顺便把答案设了。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int sx,sy;
int a[405][405];
int book[405][405];
int nxt[8][2]={{-2,1},{-2,-1},{-1,2},{-1,-2},{2,1},{2,-1},{1,2},{1,-2}};
queue<int> qx;
queue<int> qy;
queue<int> qs;
void BFS()
{
    while(!qx.empty()&&!qy.empty())
    {
        for(int i=0;i<8;i++)
        {
            int tx=qx.front()+nxt[i][0];
            int ty=qy.front()+nxt[i][1];
            int ts=qs.front()+1;
            if(tx<=0||tx>n||ty<=0||ty>m)
                continue;
            if(book[tx][ty]==1)
                continue;
            a[tx][ty]=ts;
            book[tx][ty]=1;
            qx.push(tx);
            qy.push(ty);
            qs.push(ts);
        }
        qx.pop();
        qy.pop();
        qs.pop();
    }
}
int main()
{
    scanf("%d %d %d %d",&n,&m,&sx,&sy);
    qx.push(sx);
    qy.push(sy);
    qs.push(0);
    book[sx][sy]=1;
    BFS();
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            if(book[i][j])
                printf("%-5d",a[i][j]);
            else
                printf("%-5d",-1);
        printf("\n");
    }
    return 0;
}

  

posted on 2020-08-06 17:23  鹿我所录  阅读(159)  评论(0编辑  收藏  举报

导航