个人感想
终于不用看题解的思路写题了(大概率是题比较简单)
函数预处理
如果要实现两个函数间的互相调用,直接使用会报错,因为在你第一个函数中调用的第二个函数其实还没被定义。所以需要进行函数的预处理,将次函数(排序较后的函数)可以预处理定义即可解决。
解题思路
这题非常简单,仔细观察样例就能发现它在黑白棋皆剩3颗棋子前步骤完全可以简化成两个步骤的重复,最后3颗的移动完全可以照抄(直接打表最简单)
实现
用 l,m分别代表黑白棋相接的部分和空格部分,用两个函数互相调用模拟那两个步骤(注意l和m的每次循环后更新值就好了)再判断到黑白棋剩3颗打表解决。
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <iomanip>
using namespace std;
char a[203];
int n;
void sort1();
void sort2(int n, int m);
void sort3();
void sort1(int l, int m) {
for (int i = 1; i <= 2 * n + 2; i++) {
cout << a[i];
}
cout << endl;
char b, c;
b = a[l];
c = a[l + 1];
a[l] = a[m];
a[l + 1] = a[m + 1];
a[m] = b;
a[m + 1] = c;
sort2(l, m - 2);
}
void sort2(int l, int m) {
for (int i = 1; i <= 2 * n + 2; i++) {
cout << a[i];
}
cout << endl;
if (l - 1 == 3) {
sort3();
return ;
} else {
char b, c;
b = a[l];
c = a[l + 1];
a[l] = a[m];
a[l + 1] = a[m + 1];
a[m] = b;
a[m + 1] = c;
sort1(l - 1, m );
}
}
void sort3() {
cout << "ooo*o**--";
for (int i = 10; i <= 2 * n + 2; i++) {
cout << a[i];
}
cout << endl;
cout << "o--*o**oo";
for (int i = 10; i <= 2 * n + 2; i++) {
cout << a[i];
}
cout << endl;
cout << "o*o*o*--o";
for (int i = 10; i <= 2 * n + 2; i++) {
cout << a[i];
}
cout << endl;
cout << "--o*o*o*o";
for (int i = 10; i <= 2 * n + 2; i++) {
cout << a[i];
}
}
int main() {
cin >> n;
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] = '-';
sort1(n, 2 * n + 1);
return 0;
}
标签:函数,int,void,P1259,棋子,include,预处理
From: https://www.cnblogs.com/sdlypsck/p/17926809.html