有 2n 个棋子排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为 n=5 的情况:
移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如 n=5 时,成为:
任务:编程打印出移动过程。
输入格式
一个整数 n。
输出格式
若干行,表示初始状态和每次移动的状态,用 o 表示白子,* 表示黑子,- 表示空行。
思路:
我是肺雾,只能找规律打表了,从第一行到倒数第五行的移动方式很简单。都是将字符不断往前移动使两个不同颜色的棋相邻,再将两两移动到末尾。由于java没有指针这个东西,所以只能通过数组的下标来完成两个数的交换。
后四行的的数据实在是看不出来有什么规律,只能通过打表的方式来完成了,可以看到每行只有前9个字符在发生变化,所以我们将最后四行前9个字符存起来,然后输出剩余字符即可。
代码:
import java.util.Scanner;
public class Main {
static Scanner sc = new Scanner(System.in);
static char[] ch = new char[205];
static String[] s = new String[]{"ooo*o**--","o--*o**oo","o*o*o*--o","--o*o*o*o"};
public static void main(String[] args) {
int n = sc.nextInt(),len = n;
ch[2*n+1] = '-';ch[2*n+2] = '-';
for (int i = 1; i <= n; i++) {
ch[i] = 'o';
ch[i+n] = '*';
}
for (int i = 1; i <= 2 *n + 2; i++)System.out.print(ch[i]);System.out.println();
while(len > 3) { //棋子的个数
swap(ch, len, 2 * len + 1);//移动前状态
swap(ch, len+1, 2 * len + 2);
for (int i = 1; i <= 2 *n + 2; i++)System.out.print(ch[i]);System.out.println();
swap(ch,len, 2 * len);//移动后状态
swap(ch,len+1, 2 * len-1);
if(len-1 == 3) {len--;break;}
for (int i = 1; i <= 2 *n + 2; i++)System.out.print(ch[i]);System.out.println();
len--;
}
for (int i = 0; i < s.length; i++) {
System.out.print(s[i]);
for (int j = 2*len + 4; j <= 2 * n + 2; j++)System.out.print(ch[j]);System.out.println();
}
}
static void swap(char[] num,int a,int b) {
char temp = num[a];
num[a] = num[b];
num[b] = temp;
}
}