P1259 黑白棋子的移动(函数预处理)

发布时间 2023-12-25 19:22:14作者: 拍手称快

P1259 黑白棋子的移动

个人感想

终于不用看题解的思路写题了(大概率是题比较简单)

函数预处理

如果要实现两个函数间的互相调用,直接使用会报错,因为在你第一个函数中调用的第二个函数其实还没被定义。所以需要进行函数的预处理,将次函数(排序较后的函数)可以预处理定义即可解决。

解题思路

这题非常简单,仔细观察样例就能发现它在黑白棋皆剩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;
}