棋盘游戏
【问题描述】 在不同棋类游戏中,棋子的走法总是一定的。比如中国象棋中的“马走日,象走田,车走直线,炮越山”。为了增加游戏的趣味性,西西想要融合围棋棋盘,来一场碰撞游戏。游戏规则: 1)每局游戏需要两位参与者,分别执黑棋、白棋;2)棋子每步按“日”或“田”字进行一步的飞跃; 如果限定终点位置是(1,1),给出两位参与者的起点位置,你能计算出这两个位置到达终点的最少步数分别是多少吗?(注:棋盘左上角坐标为(1,1),地图大小不超过100*100) 输入:两行,第一行两个整数表示黑棋的初始位置,第二行两个整数表示白棋的初始位置。 输出:两行,分别表示黑棋与白棋到达终点(1,1)的最少步数值。
【样例输入】1216 18 10
【样例输出】 8 9
【过程分析】解题思路:本题目标:黑棋、白棋移动到红色终点位置(如下方左图),最少步数分别是多少。 如果创建两个队列来描述整个过程,较为繁琐。因此,本题做逆向考虑(如下方右图):由红点出发,走到黑棋、白棋位置,最少需要多少步。
代码如下:
#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<fstream>
using namespace std;
struct node {
int x;
int y;
int step;
};
int book[101][101];
struct node que[10001];
int next[12][2] = {
{-2,1},{-1,2},{1,2},{2,1},{2,-1},
{1,-2},{-1,-2},{-2,-1},{-2,2},{2