洛谷P1259 Java解法
程序员文章站
2022-07-13 13:48:09
...
题目出处点这里
思路:
1、第一行为原来的状态
2、第二行把第一行空格左边的中间的两个棋子与空格换位
3、第三行把第二行的空格与最后两个黑棋互换(也可以看作把黑子向左移两格)
4、第四行把第三行空格左边的中间的两个棋子与空格换位
5、。。。。。同上
据此,我们可以使用递归完成此题
但是注意到从倒数第四行开始,棋子的移动开始变得扑朔迷离起来,我找了一会没找到规律,于是我们可以选择直接将其打出来
代码里有注释:
package reintroduction_recursion;
import java.util.Scanner;
public class P1259 {
static StringBuilder sb;
static int n;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
sb = new StringBuilder();
n = sc.nextInt();
for (int i = 0; i < n; i++) {
sb.append("o");
}
for (int i = 0; i < n; i++) {
sb.append("*");
}
sb.append("--");
System.out.println(sb);
m(n);
// 既然找不到规律,我们直接将后三行打出来即可
sb.replace(3, 5, "*o");
sb.replace(7, 9, "--");
System.out.println(sb);
sb.replace(1, 3, "--");
sb.replace(7, 9, "oo");
System.out.println(sb);
sb.replace(1, 3, "*o");
sb.replace(6, 8, "--");
System.out.println(sb);
sb.replace(0, 2, "--");
sb.replace(6, 8, "o*");
System.out.println(sb);
}
public static void m(int n) {
// 先判断是否可以结束递归
if (n <= 3) {
return;
}
if (n >= 4) {
//这里需要注意n=4的时候可以输出此段
sb.replace(n - 1, n + 1, "--");
sb.replace(2 * n, 2 * (n + 1), "o*");
System.out.println(sb);
}
if (n > 4) {
//这里需要注意n=4的时候是不可以输出此段的,因为n=4时应该输出的是倒数第四行的格式
sb.replace(n - 1, n + 1, "**");
sb.replace(2 * (n - 1), 2 * n, "--");
System.out.println(sb);
}
m(n - 1);
}
}