Knight Moves

題目描述

原題來自:POJ 1915

編寫一個程序,計算一個騎士從棋盤上的一個格子到另一個格子所需的最小步數。騎士一步可以移動到的位置由下圖給出。

 

輸入

第一行給出騎士的數量 n。

在接下來的3n行中,每3行描述了一個騎士。其中,

  • 第一行一個整數 L表示棋盤的大小,整個棋盤大小爲L×L;
  • 第二行和第三行分別包含一對整數 (x,y),表示騎士的起始點和終點。假設對於每一個騎士,起始點和終點均合理。

輸出

對每一個騎士,輸出一行一個整數表示需要移動的最小步數。如果起始點和終點相同,則輸出 0。

樣例輸入

3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1

樣例輸出

5
28
0

提示

數據範圍與提示

對於 100% 的數據,有4≤L≤300,保證0≤x,y≤L−1。

題解:

模板廣搜,直接bfs即可

代碼:

#include<bits/stdc++.h>
using namespace std;
int n;
#define MAXN 305
char a[MAXN][MAXN];
bool vis[MAXN][MAXN];
int dir[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
struct node
{
    int x;
    int y;
    int step;
}q[100005];
void bfs(int sx,int sy,int ex,int ey)//bfs
{
    int head=1,tail=1;
    memset(vis,0,sizeof(vis));
    vis[sx][sy]=1;
    q[tail].x=sx;
    q[tail].y=sy;
    q[tail].step=0;
    tail++;
    while(head<tail)
    {
        int x=q[head].x;
        int y=q[head].y;
        int step=q[head].step;
        if(x==ex&&y==ey)
        {
            printf("%d\n",step);
            break;
        }
        for(int i=0;i<8;i++)//注意有八個方向
        {
            int nx=x+dir[i][0];
            int ny=y+dir[i][1];
            if(nx>=0&&nx<n&&ny>=0&&ny<n&&vis[nx][ny]==0)
            {
                vis[nx][ny]=1;
                q[tail].x=nx;
                q[tail].y=ny;
                q[tail].step=step+1;
                tail++;
            }
        }
        head++;
    }
}
int main()
{
    int t;
    int sx,sy,ex,ey;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
        bfs(sx,sy,ex,ey);
    }
    return 0;
}

 

發佈了57 篇原創文章 · 獲贊 12 · 訪問量 4824
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章