騎士問題


題目
題目描述
小明是一名出色的棋手,聲稱沒有人能像他那樣快速地把騎士從一個位置移到另一個位置,你能打敗他嗎?
編寫一個程序,計算一個騎士從棋盤上的一個格子到另一個格子所需的最小步數。騎士一步可以移動到的位置由下圖給出。
輸入
第一行給出騎士的數量 n。對於每一個騎士都有3行,第一行一個整數 L 表示棋盤的大小(4≤L≤300),整個棋盤大小為 L×L;
第二行和第三行分別包含一對整數 (x,y),表示騎士的起始點和終點。假設對於每一個騎士,起始點和終點均合理。
輸出
對每一個騎士輸出一行,一個整數表示需要移動的最小步數。如果起始點和終點相同,則輸出 0。
樣例輸入
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
樣例輸出
5
28
0
分析
這道題是一道廣搜題,用深搜可能會時間超限。這道題難度也不低,代碼很長,需要用到隊列queue
代碼
#include<bits/stdc++.h>
using namespace std;
bool vis[301][301];
int step[301][301],ans,t,n,sx,sy,ex,ey,nx,ny;
int main()
{
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d%d%d",&n,&sx,&sy,&ex,&ey);
        queue<int> qx,qy;
        qx.push(sx),qy.push(sy);
        vis[sx][sy]=1;
        step[sx][sy]=0;
        while(!qx.empty()&&!qy.empty()){
            nx=qx.front(),qx.pop();
            ny=qy.front(),qy.pop();
            if(nx==ex&&ny==ey){
                ans=step[ex][ey];//如果達到終點,則停止 
                break;
            }
            if(nx-2>=0&&ny+1<=n&&vis[nx-2][ny+1]==0)//八個方向開始搜索 
            {
                qx.push(nx-2);
                qy.push(ny+1);
                step[nx-2][ny+1]=step[nx][ny]+1;
                vis[nx-2][ny+1]=1;
            }
            if(nx-2>=0&&ny-1>=0&&vis[nx-2][ny-1]==0)
            {
                qx.push(nx-2);
                qy.push(ny-1);
                step[nx-2][ny-1]=step[nx][ny]+1;
                vis[nx-2][ny-1]=1;
            }
            if(nx-1>=0&&ny+2<=n&&vis[nx-1][ny+2]==0)
            {
                qx.push(nx-1);
                qy.push(ny+2);
                step[nx-1][ny+2]=step[nx][ny]+1;
                vis[nx-1][ny+2]=1;
            }
            if(nx-1>=0&&ny-2>=0&&vis[nx-1][ny-2]==0)
            {
                qx.push(nx-1);
                qy.push(ny-2);
                step[nx-1][ny-2]=step[nx][ny]+1;
                vis[nx-1][ny-2]=1;
            }
            if(nx+1<=n&&ny+2<=n&&vis[nx+1][ny+2]==0)
            {
                qx.push(nx+1);
                qy.push(ny+2);
                step[nx+1][ny+2]=step[nx][ny]+1;
                vis[nx+1][ny+2]=1;
            }
            if(nx+2<=n&&ny+1<=n&&vis[nx+2][ny+1]==0)
            {
                qx.push(nx+2);
                qy.push(ny+1);
                step[nx+2][ny+1]=step[nx][ny]+1;
                vis[nx+2][ny+1]=1;
            }
            if(nx+2<=n&&ny-1>=0&&vis[nx+2][ny-1]==0)
            {
                qx.push(nx+2);
                qy.push(ny-1);
                step[nx+2][ny-1]=step[nx][ny]+1;
                vis[nx+2][ny-1]=1;
            }
            if(nx+1<=n&&ny-2>=0&&vis[nx+1][ny-2]==0)
            {
                qx.push(nx+1);
                qy.push(ny-2);
                step[nx+1][ny-2]=step[nx][ny]+1;
                vis[nx+1][ny-2]=1;
            }
        }
        printf("%d\n",ans);
        memset(vis,0,sizeof(vis));//因為有多組樣例,所以需要置零 
        memset(step,0,sizeof(step));
        nx=0,ny=0,ans=0;
        while(!qx.empty()&&!qy.empty()){//清空隊列 
            qx.pop();
            qy.pop();
        }
    }
    return 0;
}
 
          

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM