骑士-搜索树

问题 C: 骑士

时间限制: 1 Sec 内存限制: 128 MB

题目描述

国际象棋中骑士的走法如图所示。
骑士-搜索树_第1张图片

请计算给定骑士在棋盘上的起点,走到终点所需最少步数。

输入

每个测试包括一行,为用空格隔开的起点和终点。每个点由字母表示的列+数字表示的行组成。

输出

最少步数

样例输入

e2 e4
a1 b2
b2 c3
a1 h8

样例输出

2
4
2
6

AC代码

#include
using namespace std;

int go_next[8][2] = {
      {
     1,2},{
     1,-2},{
     2,1},{
     2,-1},{
     -1,2},{
     -1,-2},{
     -2,1},{
     -2,-1} };

bool is_leagle(string node)
{
     
	if (node[0] < 'a' || node[0]> 'h' || node[1] < '1' || node[1] > '8')
	//国际象棋棋盘的边界检查
		return false;
	return true;
}

int main()
{
     
	string start, end;
	while (cin >> start >> end) {
     
		map<string, int>depth;
		queue<string>search_queue;
		search_queue.push(start);
		while (!search_queue.empty())
		{
     
			string cur_node = search_queue.front();
			search_queue.pop();
			if (cur_node == end)
				break;
			for (int i = 0; i < 8; i++)
			{
     
				string new_node = cur_node;
				new_node[0] += go_next[i][0];
				new_node[1] += go_next[i][1];
				if (is_leagle(new_node) && depth.find(new_node) == depth.end())
				{
     
					depth[new_node] = depth[cur_node] + 1;
					search_queue.push(new_node);
				}
			}
		}
		cout << depth[end] << endl;
	}
	return 0;
}

谢谢朋友们!

你可能感兴趣的:(算法与数据结构)