Knight Moves题解

题目描述

原题来自:POJ 1915

编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数。骑士一步可以移动到的位置由下图给出。

Knight Moves题解

输入格式

第一行给出骑士的数量 n。
在接下来的 3n行中,每 3 行描述了一个骑士。其中,

  • 第一行一个整数 L 表示棋盘的大小,整个棋盘大小为  L×L;
  • 第二行和第三行分别包含一对整数 (x,y)(x,y),表示骑士的起始点和终点。假设对于每一个骑士,起始点和终点均合理。

输出格式

对每一个骑士,输出一行一个整数表示需要移动的最小步数。如果起始点和终点相同,则输出 0。

样例

Input Output
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
5
28
0

数据范围与提示

对于 100\%100% 的数据,有 4<= L<=300 4≤L≤300,保证 0≤x,y≤L−1。

这是一道标准的宽搜题,只要套模板即可。

#include<bits/stdc++.h>
using namespace std;
bool flag[301][301];
int a[101][101];
int dy[9]={0,-1,-2,-1,-2,1,2,1,2};
int dx[9]={0,2,1,-2,-1,-2,-1,2,1};
int l;
struct note
{
    int x;
    int y;
    int step;
}que[100010];
void bfs(int sx,int sy,int ex,int ey)
{
    int nx,ny;
    int head=1,tail=1;
    memset(flag,0,sizeof(flag));
    flag[sx][sy]=1;
    que[tail].x=sx;
    que[tail].y=sy;
    que[tail].step=0;
    tail++;
    while(head<tail)
    {
        int x=que[head].x;
        int y=que[head].y;
        int step=que[head].step;
        if (x==ex&&y==ey)
        {
            cout<<step<<endl;
            break;
        }
        for (int i=1;i<=8;i++)
        for (int j=1;j<=8;j++)
        {
            nx=x+dx[i];
            ny=y+dy[i];
            if (nx>=0&&nx<l&&ny>=0&&ny<l&&flag[nx][ny]==0)
            {
                flag[nx][ny]=1;
                que[tail].x=nx;
                que[tail].y=ny;
                que[tail].step=step+1;
                tail++;
            }
        }
        head++;
    }
}
int main()
{
    int n,sx,sy,ex,ey;
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        
        cin>>l;
        cin>>sx>>sy>>ex>>ey;
        bfs(sx,sy,ex,ey);
     }
    return 0;
}

此题还有一种更加简便也出错较少的方法,就是用STL,鉴于本人掌握还不是很熟练,代码可能有很多缺漏(求生欲)

(tip:用万能头文件就不可以用STL)

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
char s1[5],s2[5];
struct node
{
    int x;
    int y;
    int step;
};
int aa[10][10];
int d[8][2]= {{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
int ex,ey;
int judge(int x,int y)
{
    if(x>=0&&y>=0&&x<8&&y<8&&!aa[x][y])
        return 1;
    else
        return 0;
}
int bfs()
{
   int i;
   queue<node>q;
   node p,a;
   p.x=s1[0]-'a';
   p.y=s1[1]-'1';
   p.step=0;
   ex=s2[0]-'a';
   ey=s2[1]-'1';
   aa[p.x][p.y]=1;
   q.push(p);
   while(!q.empty())
   {
       a=q.front();
       if(a.x==ex&&a.y==ey)
           return a.step;
       for(i=0;i<8;i++)
       {
           node b;
           b=a;
           b.x+=d[i][0];
           b.y+=d[i][1];
           if(judge(b.x,b.y))
           {
               b.step++;
               aa[b.x][b.y]=1;
               q.push(b);
           }
       }
       q.pop();
   }
}
int main()
{
    int n;
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%s%s",s1,s2);
        bfs();
        memset(aa,0,sizeof(aa));
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
    }
     return 0;
 }

 

上一篇:LeetCode 2 两数相加


下一篇:第3项:用私有构造器或者枚举类型强化Singleton属性