You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.2 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
//n几个空心的圆
//sp:空格开始的位置索引
int n, sp, st = 0;
//用来模拟的字符数组
char c[101];
//打印
void print() {
int i;
cout << "step " << st << ":";
for (i = 1; i <= 2 * n + 2; i++) cout << c[i];//进行输出
cout << endl;
st++;
}
//移动一步
void move(int k) {
int j;
for (j = 0; j <= 1; j++) { //循环两次,一次移动两个
c[sp + j] = c[k + j];
c[k + j] = '-';
}
sp = k;
//输出
print();
}
//主要过程
void mv(int n) {
//n等于4的情况要特殊处理
if (n == 4) {
move(4);
move(8);
move(2);
move(7);
move(1);
//以上是人为观察出来的死的步骤,真也太扯了吧,是人能想出的招吗这和分治有啥关系Shit~
} else {
/*
n>42n1n=4线(n4)×2+5
n>4
45
*/
move(n); //将中间的一对两个不同的棋子移到最右边的空位
move(2 * n - 1); //再把最右边的黑棋子移到先前的空位上
//转化为子问题
mv(n - 1);
}
}
int main() {
//输入+输出重定向
freopen("../1308.txt", "r", stdin);
cin >> n;
//初始化
int i;
sp = 2 * n + 1;
for (i = 1; i <= n; i++) c[i] = 'o';
for (i = n + 1; i <= 2 * n; i++) c[i] = '*';
c[2 * n + 1] = '-';
c[2 * n + 2] = '-';
//输出原始的形态
print();
//mv函数调用包含输出
mv(n);
//关闭文件
fclose(stdin);
return 0;
}