题目链接
观察样例
不难发现在剩下最后三对黑白棋子待匹配以前是十分有规律的,那么我们寻找规律,再记最后剩下三对棋子的匹配方法即可.
观察发现有两种移动方式,一种是一黑一白,移动到- - 处,另外一种是两个黑移动到- -处,且第一种移动方式和第二种移动方式交替进行并且开始时总是由中间两个棋子先进行.那么接下来只要根据下标来进行模拟即可,我们记录中间位置的下标,与待交换空格的下标,发现7.8->15.16 7.8->13.14 6.7->13.14 6.7->11.12 发现规律详情见代码.
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int s1, s2, k1, k2;
char c[4][11] = { "--o*o*o*o*","o*o*o*--o*","o--*o**oo*","ooo*o**--*"};//打表最终4种情况
char t[1005];
char ans[1005];
void move1(int s, int k);
void move2(int s, int k);
void innit(int n)//初始化
{
for (int i = 0; i < n; i++)
ans[i] = 'o';
for (int i = n; i < 2 * n; i++)
ans[i] = '*';
ans[2 * n] = '-', ans[2 * n + 1] = '-';
cout << ans<<endl;
}
void move1(int s,int k)//第一种方式
{
ans[s] = '-', ans[s - 1] = '-', ans[k] = 'o', ans[k + 1] = '*';
cout << ans<<endl;
k -= 2;
move2(s, k);
}
void move2(int s, int k)//第二中方式
{
if (k == 6)return;
ans[s] = '*', ans[s - 1] = '*', ans[k] = '-', ans[k + 1] = '-';
cout << ans<<endl;
s--;
move1(s, k);
}
int main()
{
int n;
cin >> n;
innit(n);
int s = n,k=2*n;
move1(n, k);
cout << t;
string ss;
for (int i = 0; i < n - 4; i++)//后面已经排好
ss += "o*";
for (int i = 3; i>=0; i--)
cout << c[i] << ss << endl;
}