UVA: 439 骑士的移动

题意:8 * 8的标准棋盘上的两个格子(列用啊表示,行用1-8表示),求马最少需要走多少步从起点到终点,例如从a1到b2需要4步。

思路:最短路使用BFS求解,路径长度运用层数的概念,将孩子的路径的长度定为父母的路径长度加一

#include <stdio.h> #include <iostream> #include <queue> #include <cmath> #include <string> 使用namespace std; int position [8] [2] = {{1,2},{2,1},{2,-1},{1,-2},{ - 1,-2},{ - 2,-1 },{ - 2,1},{ - 1,2}}; //骑士移动的8个方向 int a1,b1,a2,b2; 字符串xx,yy; bool squre [8] [8]; //判断当前点是否遍历过 int squr [8] [8]; //记录路径长度 int mic; struct point {//点 int x,y; 点(int xx,int yy){ X = XX; Y = YY; } }; bool in_out(int x,int y){ 如果(X <8 &&ÿ<8 && X> = 0 && Y> = 0)//判断是否出局 返回true; 返回false; } void bfs(int x,int y)// BFS求最短路 { 队列<point> all; //队列 点tmp(x,y); all.push(TMP); 而(!all.empty()){ X = all.front()X。; Y = all.front()Y。; all.pop(); for(int i = 0; i <8; i ++){ 如果(IN_OUT(X +位置[I] [0],Y +位置[I] [1])&& squre [X +位置[I] [0]] [Y +位置[I] [1]]){ squre [X +位置[I] [0]] [Y +位置[I] [1]] = FALSE; 直齿圆柱[X +位置[I] [0]] [Y +位置[I] [1] =直齿圆柱[X] [Y] 1; //层数的概念记录长度,孩子的路径长度是父的长度加一 如果((X +位置[I] [0])== A2 &&(Y +位置[I] [1])== b2)的回报; 点t(x +位置[i] [0],y +位置[i] [1]); all.push(T); } }
             } } int main(){ 而(CIN >> XX YY >>){ A1 = XX [0] - 'A'; //处理输入 B1 = XX [1] - '1'; A2 = YY [0] - 'A'; B2 = YY [1] - '1';
 for(int i = 0; i <8; i ++){ for(int j = 0; j <8; j ++){ squre [i] [j] = TRUE; 直齿圆柱[i] [j] = 0; } }
         MIC = 999; squre [A1] [B1] = FALSE; 如果(A1 A2 == && B1 B2 ==){//如果终点与起始点相同 MIC = 0; }其他{ BFS(A1,B1); MIC =直齿圆柱[A2] [B2]。 }
         cout <<“要从”<< xx <<“到”<< yy <<“获取”<< mic <<“骑士移动。”<< endl; } }

    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/wuzhenzi5193/article/details/80204985
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞