跳至主要內容

黑白棋子的移动

莫传航2024年11月15日大约 2 分钟教学文档递归

黑白棋子的移动

洛谷-P1259open in new window

题目描述

2n个棋子排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为 n=5 的情况:

移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如 n=5 时,成为:

任务:编程打印出移动过程。

输入格式

一个整数 n

输出格式

若干行,表示初始状态和每次移动的状态,用 \verb!o! 表示白子,\verb!*! 表示黑子,\verb!-! 表示空行。

样例 #1

样例输入 #1

7

样例输出 #1

ooooooo*******--
oooooo--******o*
oooooo******--o*
ooooo--*****o*o*
ooooo*****--o*o*
oooo--****o*o*o*
oooo****--o*o*o*
ooo--***o*o*o*o*
ooo*o**--*o*o*o*
o--*o**oo*o*o*o*
o*o*o*--o*o*o*o*
--o*o*o*o*o*o*o*

提示

4\leq n\leq 100

我的代码

import java.util.*;
import java.io.*;
public class Main{
    static int sp,n;
    static char[]a=new char[226];
    public static void main(String[] args)throws IOException{
        
        BufferedReader cin=new BufferedReader(new InputStreamReader(System.in));
        n=Integer.parseInt(cin.readLine());
        
        for(int i=1;i<=n;i++){
            a[i]='o';
        }
        for(int i=n+1;i<=2*n;i++){
            a[i]='*';
        }
        a[2*n+1]='-';
        a[2*n+2]='-';
        sp=2*n+1;
        printff();
        pu(n);
        cin.close();
    }
    static void printff(){
        String s=String.valueOf(a);
        System.out.println(s.substring(1,2*n+3));
    }
    static void move(int p){
        for(int j=0;j<=1;j++){
            a[sp+j]=a[p+j];
            a[p+j]='-';
        }
        sp=p;
        printff();
    }
    static void pu(int k){
        if(k==4){
            move(4);move(8);move(2);move(7);move(1);
        }else{
            move(k);move(2*k-1);pu(k-1);
        }
    }
}
上次编辑于: 2024/11/15 10:22:04
贡献者: molittle