5-14 独立钻石跳棋问题
问题描述
独立钻石跳棋的棋盘上有 33 个方格,每个方格中可放 1 枚棋子。棋盘中最多可摆放 32枚棋子。下棋的规则是任一棋子可以沿水平或垂直方向跳过与其相邻的棋子进入空着的方格 并吃掉被跳过的棋子。试设计一个算法,对于任意给定的棋盘布局,找出一种下棋方法,使得最终棋盘上只剩下一个棋子。
对于给定的独立钻石跳棋的棋盘初始布局,和棋盘上最终剩下的棋子所在的位置(x,y), 编程计算一种遵循下棋的规则下棋方法,使最终棋盘上仅在位置(x,y)处有一枚棋子。当 (x,y)=(0,0)时,表示不指定棋子的最终位置。棋子位置的坐标定义如下。
数据输入:
第一行中有 1 个正整数 n,表示棋盘的初始布局 中有 n 个棋子。第 2 行起每行 2 个数,分别是 n 个棋子的位置。最后 1 行是棋盘上最终剩下的棋子所在的位置。
结果输出:
每行有 2 对方格 坐标(a,b)和(c,d),表示从方格(a,b)跳到方格(c,d)。问题无解时输出“No”solution!。
Java
package Chapter5HuiSuFa;
import java.util.Scanner;
public class DuLiZuanShiTiaoQi {
//Move: 棋子走步
//(sx,xy):起步坐标 (xv,yv):走步方向
private static class Move{
int sx;
int sy;
int xv;
int yv;
}
private static int MAX = 100000;
private static int SIZE = 7;
private static int num;
private static int endx,endy;
private static int[][] board = new int[SIZE][SIZE];//board[7][7]表示棋盘;board[x][y]:0->空方格 1->棋子占用方格 2->棋盘外方格
private static Move[] moves = new Move[MAX];
private static Move[] ans = new Move[MAX];
private static int count;
private static long[][] gmoves;
private static long gboard;
public static void main(String[] args){
Scanner input = new Scanner(System.in);
while (true){
count = 0;
int x,y;
init();
num = input.nextInt();