Uva 439 Knight Moves

本文通过广度优先搜索(BFS)算法解决国际象棋中骑士从一个位置移动到另一个位置所需的最少步数问题。

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

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

int IsVis[9][9];//记录位置是否被访问
int StaX,StaY,EndX,EndY;
char Start[3],End[3]; //起始及结束位置
typedef struct node
{
    int x,y,MoveNum;
}knight;
int Move[8][2]={-1,2, -2,1, 2,1, 1,-2, 1,2, 2,-1, -1,-2, -2,-1};//骑士的移动方位
void Bfs(int x,int y);

int main(){
    //freopen("D:\\t.txt","r",stdin);
    while(cin>>Start>>End){
        StaX = Start[0] - 'a' + 1;
        StaY = Start[1] - '0';
        EndX = End[0] - 'a' + 1;
        EndY = End[1] - '0';//对输入的棋子的位置进行处理
        Bfs(StaX,StaY);
    }
    return 0;
}
void Bfs(int x,int y){
    knight m,n;
    queue<knight> Que;

    m.x = x;
    m.y = y;
    m.MoveNum = 0;
    memset(IsVis,0,sizeof(IsVis));//每一回合棋盘初始化
    IsVis[m.x][m.y] = 1;
    Que.push(m);
    while(!Que.empty()){
        m = Que.front();
        Que.pop();
        if(m.x == EndX&&m.y == EndY){
            cout<<"To get from "<<Start[0]<<Start[1]<<" to "<<End<<" takes "<<m.MoveNum<<" knight moves."<<endl;
            break;
        }//如果到达结束位置,结束
        for(int i = 0;i < 8;i++){
            if((m.x + Move[i][0] > 0) && (m.x + Move[i][0] < 9) && (m.y + Move[i][1] > 0) && (m.y + Move[i][1] < 9)
               && !IsVis[m.x + Move[i][0]][m.y + Move[i][1]]){//判断移动是否超范围及是否被访问
                n.x = m.x + Move[i][0];
                n.y = m.y + Move[i][1];
                n.MoveNum = m.MoveNum + 1;
                Que.push(n);
            }
        }
    }

}



题目说的是骑士从一个位置移动到另一个位置所需的步数,国际象棋里骑士移动和中国象棋里的马类似,都是“日”形。

 题目用bfs求解,要运用到队列,使得骑士走的步数不断更新。以便在bfs过程中,统计的移动步数是最短的。

 
 
 
 
 
 
 
 
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值