Uva439——Knight Moves

简单的BFS。只是国际象棋的棋盘有点特殊,坐标需要转换下。

AC代码:

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

struct node
{
	int x, y, count;
};

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

int num[10][10];
int ans;

int bfs(int x1, int y1, int x2, int y2)
{
	int x, y, z;
	memset(num, 0, sizeof(num));
	queue<node> Q;
	node n;
	n.x = x1;
	n.y = y1;
	n.count = 0;
	num[x1][y1] = 1;
	Q.push(n);
	while(!Q.empty())
	{
		n = Q.front();
		Q.pop();
		x = n.x;
		y = n.y;
		z = n.count;
		if(x == x2 && y == y2)
			return z;
		for(int i = 0; i < 8; i++)
		{
			if(x + xy[i][0] >= 1 && x + xy[i][0] <= 8 && y + xy[i][1] >= 1 && y + xy[i][1] <= 8)
			{
				if(num[x + xy[i][0]][y + xy[i][1]] == 0)
				{
					n.x = x + xy[i][0];
					n.y = y + xy[i][1];
					n.count = z + 1;
					num[n.x][n.y] = 1;
					Q.push(n);
				}
			}
		}
	}
	return 0;
}

int main()
{
//	freopen("1.txt", "r", stdin);
	char str1[3], str2[3];
	while(cin >> str1 >> str2)
	{
		int x1 = str1[0] - 'a' + 1;
		int y1 = 8 - (str1[1] - '1');

		int x2 = str2[0] - 'a' + 1;
		int y2 = 8 - (str2[1] - '1');
		cout << "To get from " << str1 << " to " << str2 << " takes " << bfs(x1, y1, x2, y2) << " knight moves." << endl;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值