黑白棋子的移动
2024年11月15日大约 2 分钟教学文档递归
黑白棋子的移动
题目描述
有 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);
}
}
}