洛谷P1443马的遍历

思路:通过x[],y[],数组表示马的行坐标与列坐标的变化,运用BFS找到接下来可能要走的点,然后判断该点是否已经走过了,如果没有,那么此点元素数字变为走到此点的步数并入队,同时标记该点
注意:本文代码中多了一个end指针,该指针的作用是指向队列最后一个元素,减少对队尾元素的寻找,节约时间

#include
using namespace std;
int** MAP;
int n,m,a,b;
int x[8]={-1,-2,1,2,1,2,-1,-2};
int y[8]={-2,-1,2,1,-2,-1,2,1};
typedef struct LNode
{
    int i,j;
    LNode* next;
}LNode;
LNode* front=NULL;
LNode* end=NULL;
LNode* rear=NULL;
void BFS(int n,int m)
{
    if(front==rear)
    return ;
    for(int i=0;i<8;i++)
    {
        if(front->i+x[i]i+x[i]>=0&&front->j+y[i]>=0&&front->j+y[i]i+x[i]][front->j+y[i]]==-2)
        {
            LNode* s=new LNode;
            s->i=front->i+x[i];
            s->j=front->j+y[i];
            s->next=rear;
            end->next=s;
            end=s;
            MAP[front->i+x[i]][front->j+y[i]]=MAP[front->i][front->j]+1;
        }
    }
    LNode* q=front;
    front=front->next;
    delete q;
    q=NULL;
    BFS(n,m);
    return ;
}
int main()
{
    cin>>n>>m>>a>>b;
    MAP=new int*[n];
    for(int i=0;ii=a-1;
    s->j=b-1;
    front=s;
    end=s;
    s->next=rear;
    MAP[front->i][front->j]=0;
    BFS(n,m);
    for(int i=0;i

你可能感兴趣的:(洛谷P1443马的遍历)