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 }