【例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;
}
啊啊啊,又不会了,大佬请赐教!