1 条题解

  • 0
    @ 2023-6-11 12:17:10

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
     
    //定义方向增量
    int dx[12]={1,1,-1,-1,2,2,-2,-2};
    int dy[12]={-2,2,2,-2,1,-1,1,-1};
    int s[200][200];//定义棋盘,保存到达每个步的最少步数 
    char a[200][200];//棋盘 
    int que[10000][4];
     
    int main(){
        int n,m,i,j; 
        int s1,s2,e1,e2;//开始和结束位置 
         
        cin>>m>>n;
        for(i = 1;i <= n;i++){
            for(j = 1;j <= m;j++){
                cin>>a[i][j];
                if(a[i][j] == 'K'){
                    s1 = i;
                    s2 = j;
                }else if(a[i][j] == 'H'){
                    e1 = i;
                    e2 = j;
                }
            }
        }
         
        //初始化 
        memset(s,-1,sizeof(s));
        int head=1,tail=1;//初始化队列
        //(s1,s2)点入队,到达该点的最少步数0
        que[1][1]=s1;que[1][2]=s2;que[1][3]=0;
        while(head<=tail){
            //循环8个方向,将所能到达的点入队
            for(int i=0;i<8;i++){
                //马跳跃后的位置
                int x=que[head][1]+dx[i];
                int y=que[head][2]+dy[i];
                //如果没有越界 
                if(x>=1&&y>=1&&x<=n&&y<=m&&a[x][y]!='*'){
                    //并且该点没有走过,则点入队 
                    if(s[x][y]==-1){
                        s[x][y]=que[head][3]+1; //计算从(s1,s2)到(x,y)的最少步数
                        tail++;//队尾+1
                        //x,y入队
                        que[tail][1]=x;
                        que[tail][2]=y;
                        que[tail][3]=s[x][y];
                        //到达(e1,e2)的最小路径都被求出后输出 
                        if(s[e1][e2]>0){
                            cout<<s[e1][e2]<<endl;
                            return 0;//跳出循环,不再遍历 
                        }
                    } 
                     
                }   
            } 
            head++;//出队
        } 
    }
    
    
    • 1

    信息

    ID
    2361
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者