《算法竞赛宝典》基础算法艺术

20 棋子移动

2020-05-04  本文已影响0人  DONGWEILAI

魔法世界的历史上曾经出现过一位赫赫有名的不败战神陈庆之,陈庆之以棋道悟兵法,一生身经数百战,没有一场败绩,而且没有一场不是在绝对的劣势中大胜敌军。
受此影响,魔法世界开始流行一种叫棋子移动的游戏,即有2N个棋子(N≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,例如当N=4时,棋子排列情况为:
〇〇〇〇●●●●
移动棋子的规则是:每次必须同时移动相邻两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置.每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。例如当N=4时,最终排列情况为:
〇●〇●〇●〇●
试求出移动步骤。

【输入格式】
一个整数,即N。

【输出格式】
输出移动步骤,每一步操作占一行。

【输入样例】
4
【输出样例】
4,5-->9,10
8,9-->4,5
2,3-->8,9
7,8-->2,3
1,2-->7,8

package algorithmclassic.ch02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @author Dylan
 * @date 2020/5/4 - 22:58
 */
public class Q20 {
    static int j;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        j = 2 * n + 1;
        f(n);
    }

    public static void move(int i){
        System.out.printf("%d,%d-->%d,%d\n", i, i + 1, j, j + 1);
        j = i;
    }

    // 全部转换成4的情况
    public static void f(int n){
        if(n == 4){
            move(4);
            move(8);
            move(2);
            move(7);
            move(1);
        }else{
            move(n);
            move(2 * n - 1);
            f(n - 1);
        }
    }
}



上一篇下一篇

猜你喜欢

热点阅读