一本通 1330:【例8.3】最少步数

【题目描述】

在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个(100×100)的围棋盘上任选两点A、B,A点放上黑子,B点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走,俩人一个走黑马,一个走白马。谁用最少的步数走到左上角坐标为(1,1)的点时,谁获胜。现在他请你帮忙,给你A、B两点的坐标,想知道两个位置到(1,1)点可能的最少步数。

【输入】

A、B两点的坐标。

【输出】

最少步数。

【输入样例】

12 16
18 10

【输出样例】

8
9
#include<string.h>
#include<stdio.h>
#include<queue>
int a[101][101];
bool vis[101][101];
int dir[][2] = { {-2,1},{-2,-1},{-2,2},{-2,-2},{-1,-2},{-1,2},{1,-2},{1,2},{2,1},{2,-1},{2,2},{2,-2} };
struct node
{
	int x;
	int y;
	int step;
}q[100001];
void bfs(int x0, int y0)
{
	int head = 1, tail = 1;
	memset(vis, 0, sizeof(vis));
	q[tail].x = x0;
	q[tail].y = y0;
	q[tail].step = 0;
	tail++;
	vis[x0][y0] = 1;
	while (head < tail)
	{
		int x = q[head].x;
		int y = q[head].y;
		int step = q[head].step;
		if (x == 1 && y == 1)
		{
			printf("%d\n", step);
		}
		for (int i = 0; i < 12; i++)
		{
			int nx = x + dir[i][0];
			int ny = y + dir[i][1];
			if (nx >= 1 && nx <= 100 && ny >= 1 && ny <= 100 && vis[nx][ny] == 0)
			{
				vis[nx][ny] = 1;
				q[tail].x = nx;
				q[tail].y = ny;
				q[tail].step = step + 1;
				tail++;
			}
		}
		head++;
	}
}
int main()
{
	int xa, ya, xb, yb;
	scanf("%d%d%d%d", &xa, &ya, &xb, &yb);
	bfs(xa, ya);
	bfs(xb, yb);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值