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;
}
合集:
洛谷递归与递推
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?