题解:P12270 [蓝桥杯 2024 国 Python B] 马与象

· · 题解

本题算法:BFS(广度优先搜索)。
难度建议:橙。
这题说实话,很简单,我十五分钟就写出来了,这是模版题。
我们来说一下本题的思路:

接下来我们来讲一下代码实现细节:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n";
const int maxn=1005;
struct node{
    int x,y;
    int step;
};
int n,mx,my,xx,xy;
//m开头的遍历是关于马的数组,x开头的数组和象有关。
int mway[maxn][maxn],xway[maxn][maxn];//记录每个位置的步数
bool mvis[maxn][maxn],xvis[maxn][maxn];
int mdx[]={-2,-1,1,2,2,1,-1,-2},mdy[]={-1,-2,-2,-1,1,2,2,1};//方向数组
int xdx[]={-2,2,2,-2},xdy[]={-2,-2,2,2};
bool mcheck(int x,int y){
    if(x<0||x>n||y<0||y>n){//越界了
        return true;
    }
    if(mvis[x][y]){//走过了
        return true;
    }
    return false;
}
bool xcheck(int x,int y){
    if(x<0||x>n||y<0||y>n){
        return true;
    }
    if(xvis[x][y]){
        return true;
    }
    return false;
}
void mbfs(){
    queue<node>q;
    q.push({mx,my,0});//把原点入队
    while(!q.empty()){
        node t=q.front();
        q.pop();
        for(int i=0;i<8;i++){
      //计算下一步走到的位置
            int nx=mdx[i]+t.x;
            int ny=mdy[i]+t.y;
            if(mcheck(nx,ny)){//不合法
                continue;
            }
            mvis[nx][ny]=true;
            q.push({nx,ny,t.step+1});
            mway[nx][ny]=t.step+1;//计算步数,是在上一个点走过来的,所以要加一
        }
    }
}
void xbfs(){
    queue<node>q;
    q.push({xx,xy,0});
    while(!q.empty()){
        node t=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int nx=xdx[i]+t.x;
            int ny=xdy[i]+t.y;
            if(xcheck(nx,ny)){
                continue;
            }
            xvis[nx][ny]=true;
            q.push({nx,ny,t.step+1});
            xway[nx][ny]=t.step+1;
        }
    }
}
signed main(){
    cin>>n>>mx>>my>>xx>>xy;
    for(int i=0;i<=n;i++){
        for(int j=0;j<=n;j++){
            mway[i][j]=INT_MAX;
            xway[i][j]=INT_MAX;
        }
    }
    mvis[mx][my]=true;
    xvis[xx][xy]=true;
    mway[mx][my]=0;
    xway[xx][xy]=0;
    mbfs();
    xbfs();
    int mini=INT_MAX;
    for(int i=0;i<=n;i++){
        for(int j=0;j<=n;j++){
            mini=min(mway[i][j]+xway[i][j],mini);//计算步数总和
        }
    }
    if(mini==INT_MAX){//特判,如果答案不存在,输出-1
        cout<<-1<<endl;
        return 0;
    }
    cout<<mini<<endl;
    return 0;
}