1015 Knight Moves

本文介绍了一种使用广度优先搜索(BFS)算法解决国际象棋中骑士从起点到终点最少移动次数的问题。通过定义骑士可能的八个移动方向,并采用队列进行逐层搜索,确保找到从任意起点到终点的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1015 Knight Moves

     题意:国际象棋棋盘,给定起始点和重点,求最少移动次数。

思路:在国际象棋棋盘上,共有八个方向的移动位置,对每个移动方向,将其保存到队列中,因为队列逐层搜索,所以必定可以找到最短的路径。

感想:输入有些困难,要将字符和数字分开,通过getchar()读取字符这点比较重要。

#include<iostream>

#include<queue>

#include<stdio.h>

#include<string.h>

using namespace std;

struct node{

   int x,y,cnt;

};

node s,e;

int a[9][9];

intdri[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};

int bfs(){

   memset(a,0,sizeof(a));

   node p,q;

   s.cnt=0;

    queue<node>b;

   b.push(s);

   a[s.x][s.y]=1;

   while(!b.empty()){

       p=b.front();

       b.pop();

       if(p.x==e.x&&p.y==e.y)

           return p.cnt;

       for(int i=0;i<8;i++){

           q.x=p.x+dri[i][0];

           q.y=p.y+dri[i][1];

           if(q.x<1||q.x>8||q.y<1||q.y>8) continue;

           if(a[q.x][q.y]==1) continue;

           q.cnt=p.cnt+1;

           a[q.x][q.y]=1;

           b.push(q);

       }

    }

   return -1;

}

int main(){

   char row,w;

   int col,l;

   int min;

   while(scanf("%c",&row)!=EOF){

       scanf("%d",&col);

       getchar();

       scanf("%c%d",&w,&l);

       getchar();

       s.x=row-'a'+1;

       s.y=col;

       e.x=w-'a'+1;

       e.y=l;

       if(s.x==e.x&&s.y==e.y)

           min=0;

       else

           min=bfs();

       cout<<"To get from "<<row<<col<<"to "<<w<<l<<" takes "<<min<<"knight moves."<<endl;

    }

   return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值