【题目描述】
在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个(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; }
05-07
2577
11-09
723