站外题(魔怔哥别来(大雾)
  • 板块灌水区
  • 楼主Wendy_Hello_qwq
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/12 21:27
  • 上次更新2024/7/12 21:32:16
查看原帖
站外题(魔怔哥别来(大雾)
1039211
Wendy_Hello_qwq楼主2024/7/12 21:27
【例8.3】最少步数

【问题描述】

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

#include <cstdio>
using namespace std;
int a1, a2, b1, b2;
int s[105][105];
bool a[105][105];
int h, t, q[10005][3];
int dx[12] = {-2, -1, 1, 2, 1, -1, 2, -2, -2, 2, 2, -2};
int dy[12] = {1, 2, 2, 1, -2, -2, -1, -1, 2, 2, -2, -2};
int main()
{
	scanf ("%d%d%d%d", &a1, &a2, &b1, &b2);
	h = 0, t = 1;
	q[t][0] = 1, q[t][1] = 1, q[t][2] = 0;
	s[1][1] = 0;
	a[1][1] = 1;
	while (h < t)
	{
		h++;
		int x = q[t][0];
		int y = q[t][1];
		for (int i = 0; i < 12; i++)
		{
			int xx = x + dx[i];
			int yy = y + dy[i];
			if (xx >= 1 && xx <= 100 && yy >= 1 && yy <= 100 && a[xx][yy] == 0)
			{
				t++;
				q[t][0] = xx;
				q[t][1] = yy;
				a[xx][yy] = 1;
				q[t][2] = q[h][2] + 1;
				s[xx][yy] = q[t][2];
			}
			if (s[a1][a2] != 0 && s[b1][b2] != 0)
			{
				printf ("%d\n%d", s[a1][a2], s[b1][b2]);
				return 0;
			}
		}
	}
	return 0;
}

啊啊啊,又不会了,大佬请赐教!

2024/7/12 21:27
加载中...