P1259 黑白棋子的移动

题目链接 https://www.luogu.com.cn/problem/P1259

递归+分治+打表(?)


先说思路:

初始化——(向后移——向前移——判断)(循环递归)——暴力枚举——输出


 这题....一上来让我有点儿蒙啊....但其实就在于找规律,举几个例子自己动手写一下就恍然大悟了。

比如这样:(当然,题目条件是4<=n<=100)

只需要先将中间紧挨的黑白棋子和空格交换,再将最后两个黑色棋子与空格交换就好啦!

当n=n时,第一套操作下来,最后的两个位置为“白”“黑”,变成n=n-1时的操作,再进行一套操作,变成n=n-2的操作……由此可以看出,我们可以利用递归解决此题!

(之后就很欢快地去敲键盘了!结果全部WA掉。。。。。)

后来才知道我画的每个例子的最后四行都是错的!因为空格('-')插在中间是不能看做为黑白相间的!

所以说,最后四行非常不友好,需要特判,因为找不出规律,直接打表就ok了。

拿n=5举个栗子:


 

放AC代码 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,x;//有2n个棋子
 4 char ch[210];
 5 void pr(int x)//输出函数
 6 {
 7     for(int i=1;i<=2*x+2;i++)
 8         cout<<ch[i];
 9     cout<<endl;
10 }
11 void chu()//初始化
12 {
13     cin>>n;
14     x=n;
15     for(int i=1;i<=n;i++) ch[i]='o';
16     for(int i=n+1;i<=2*n;i++) ch[i]='*';
17     for(int i=2*n+1;i<=2*n+2;i++) ch[i]='-';
18     pr(x);
19 }
20 void move(int now,int to)//换位
21 {
22     swap(ch[now],ch[to]);
23 }
24 void imp(int x)//骨干函数important
25 {
26     if(n==4)
27     {
28         move(4,9); move(5,10); pr(x);
29         move(8,4); move(9,5); pr(x);
30         move(2,8); move(3,9); pr(x);
31         move(7,2); move(8,3); pr(x);
32         move(1,7); move(2,8); pr(x);
33     }
34     else
35     {
36         move(n,2*n+1); move(n+1,2*n+2); pr(x);
37         move(n,2*n-1); move(n+1,2*n); pr(x);
38         n--;
39         imp(x);
40     }
41 }
42 int main()
43 {
44     chu();
45     imp(x);
46     return 0;
47 }

 

posted @ 2022-04-02 15:36  爱吃虾滑  阅读(223)  评论(0编辑  收藏  举报