BFS 骑士的移动

骑士的移动

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/E

题目:

Description

A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the shortest closed tour of knight moves that visits each square of a given set of n squares on a chessboard exactly once. He thinks that the most difficult part of the problem is determining the smallest number of knight moves between two given squares and that, once you have accomplished this, finding the tour would be easy.

Of course you know that it is vice versa. So you offer him to write a program that solves the "difficult" part.

Your job is to write a program that takes two squares a and b as input and then determines the number of knight moves on a shortest route from a to b.

Input Specification

The input file will contain one or more test cases. Each test case consists of one line containing two squares separated by one space. A square is a string consisting of a letter (a-h) representing the column and a digit (1-8) representing the row on the chessboard.

Output Specification

For each test case, print one line saying "To get from xx to yy takes n knight moves.".

Sample Input

e2 e4
a1 b2
b2 c3
a1 h8
a1 h7
h8 a1
b1 c3
f6 f6

Sample Output

To get from e2 to e4 takes 2 knight moves.
To get from a1 to b2 takes 4 knight moves.
To get from b2 to c3 takes 2 knight moves.
To get from a1 to h8 takes 6 knight moves.
To get from a1 to h7 takes 5 knight moves.
To get from h8 to a1 takes 6 knight moves.
To get from b1 to c3 takes 1 knight moves.
To get from f6 to f6 takes 0 knight moves.

题意: 输入标准8*8国际象棋棋盘上的两个格子(列用a~h表示,行用1~8表示),求马最少需要多少步从起点跳到终点。分析:   马每次有八个方向可以走动,直接用BFS进行搜索即可;不过要注意当马在棋盘的边境时有的方向不能走(不能越境),还有不能重复走(走过的地方进行标记)。
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <queue>
 5 using namespace std;
 6 int c[9][9];
 7 int dir[8][2] = {{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};
 8 typedef struct
 9 {
10     int x,y,count;
11 }node;
12 node start,finish;
13 int main()
14 {
15     char row,end;
16     int col,ed;
17     int min;
18     while(scanf("%c",&row)!=EOF)
19     {
20         scanf("%d",&col);
21         getchar();
22         scanf("%c%d",&end,&ed);
23         getchar();
24         start.x = row-‘a‘+1;
25         start.y = col;
26         finish.x = end-‘a‘+1;
27         finish.y = ed;
28         if(start.x==finish.x&&start.y==finish.y)
29         min = 0;
30         else
31         {
32             memset(c,0,sizeof(c));
33          node pre,cur;
34     start.count = 0;
35     queue<node> q;
36     q.push(start);
37     c[start.x][start.y] = 1;
38     while(!q.empty())
39     {
40         pre = q.front();
41         q.pop();
42         if(pre.x == finish.x&&pre.y == finish.y)
43          min=pre.count;
44         for(int i = 0; i < 8; i++)
45         {
46             cur.x = pre.x + dir[i][0];
47             cur.y = pre.y + dir[i][1];
48             if(cur.x<1||cur.x>8||cur.y<1||cur.y>8)continue;
49             if(c[cur.x][cur.y]==1)continue;
50             c[cur.x][cur.y] = 1;
51             cur.count = pre.count + 1;
52             q.push(cur);
53     }
54     }
55         }
56         printf("To get from %c%d to %c%d takes %d knight moves.\n",row,col,end,ed,min);
57     }
58     return 0;
59 }

				
时间: 2024-12-15 13:24:17

BFS 骑士的移动的相关文章

UVA 439 BFS 骑士的移动

#include<iostream> #include<cstdio> #include<string> #include<string.h> #include<math.h> #include<queue> #include<map> #include<algorithm> using namespace std; int dx,dy; struct node{ int step; int x; int y;

【BZOJ1671】[Usaco2005 Dec]Knights of Ni 骑士 BFS

[Usaco2005 Dec]Knights of Ni 骑士 Description 贝茜遇到了一件很麻烦的事:她无意中闯入了森林里的一座城堡,如果她想回家,就必须穿过这片由骑士们守护着的森林.为了能安全地离开,贝茜不得不按照骑士们的要求,在森林寻找一种特殊的灌木并带一棵给他们.当然,贝茜想早点离开这可怕的森林,于是她必须尽快完成骑士们给的任务,贝茜随身带着这片森林的地图,地图上的森林被放入了直角坐标系,并按x,y轴上的单位长度划分成了W×H(1≤W,H≤1000)块,贝茜在地图上查出了她自己

骑士问题(knight) (BFS)

题目描述 在一个标准8×8的国际象棋棋盘上,棋盘中有些格子可能是有障碍物的.已知骑士的初始位置和目标位置,你的任务是计算出骑士最少需要多少步可以从初始位置到达目标位置.有障碍物的格子当然不可以到达. 标准的8×8的国际象棋棋盘中每一个格子可以用唯一的编号确定.行用1-8这8个数字依次表示,列用a-h这8个字母依次表示.例如图中的骑士所在位置(图中有n的格子)的编号为“d4”(注意d和4之间没有空格). 我们知道国际象棋中的骑士可以按“L”路线移动(一个方向走2个格子,接着垂直方向走1个格子).因

bzoj 1671: [Usaco2005 Dec]Knights of Ni 骑士【bfs】

bfs预处理出每个点s和t的距离d1和d2(无法到达标为inf),然后在若干灌木丛格子(x,y)里取min(d1[x][y]+d2[x][y]) /* 0:贝茜可以通过的空地 1:由于各种原因而不可通行的区域 2:贝茜现在所在的位置 3:骑士们的位置 4:长着贝茜需要的灌木的土地 */ #include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace s

UVa 439骑士的移动(BFS)

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=380 做了这道题之后对BFS总算是有了点认识了. 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 int map[10][10]; 6 typedef struct node 7

HDU 2102 A计划(BFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 题目大意:公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死.骑士们在一层中只能前后左右移动,每移动一格花1时刻.层间的移动只能通过时空传输机,且不需要任何时间.每个测试数据的前一行有三个整数N,M,T. N,M迷宫的大小N*

[COGS746] [网络流24题] 骑士共存

★★☆   输入文件:knight.in   输出文件:knight.out   简单对比 时间限制:1 s   内存限制:128 MB 骑士共存问题 «问题描述: 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务: 对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑 士,使得它们彼此互不攻击. «数据输入: 由文件knight.in给出输入数据.第一行有2 个正整数n 和m (1<=n<

Sicily Knight Moves(BFS)

1000. Knight Moves                       Time Limit: 1sec    Memory Limit:32MB Description A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the shortest closed tour of knight moves that visits each square

Ni骑士(ni)

搞了半天八数码弄不出来就只好来打题解  这道题是在搜索a碰到的(链接: http://pan.baidu.com/s/1jG9rQsQ ) 感觉题目最大亮点就是这英文简写"ni", 真是令人感慨出题老师的才华啊  好了,废话不多说  题目内容如下(闲烦请无视之,下下方有简单的介绍): [问题描述] 贝 西(Bessie)在卡摩洛遇到了棘手的情况:她必须穿越由Ni骑士把守的森林. 骑士答应Bessie只要 Bessie 能给他们带来一丛灌木就能安全穿越森林.时间宝贵,Bessie 必须尽