山理校赛 E 九连环
Problem Description
不知道大家有没有玩过一个叫做 九连环 的玩具,如下图所示。
如果你不了解九连环,那玄黄就带你领略九连环的奥妙:
九连环是我国传统的民间智力玩具,玩具上面有九个连环套在杆上,目标就是通过一定的方式将九个连环从杆上全部取下来。
玩法是这样的:
1、对每个环,有2种操作:把这个环放到杆上或把这个环从杆上取下
2、你可以随意的对第1个环进行操作
3、如果你想对第i个环(i>1)进行操作,你必须将第i-1个环放在杆上,且必须把前i-2个环从杆上取下
Input
输入一个整数n ( 0<n<10 ),代表杆上面的连环个数。
Output
输出把所有连环取下来的最少操作步骤,每一步占一行,输出一个整数i和操作”UP”或者”DOWN”,代表将第i个环放到杆上或从杆上取下来,整数和操作用空格分开。详情见示例输出。
Sample Input
4
Sample Output
2 DOWN 1 DOWN 4 DOWN 1 UP 2 UP 1 DOWN 3 DOWN 1 UP 2 DOWN 1 DOWN
Hint
Source
玄黄
没有玩过九连环,高中同学到是会玩九连环。
写完了还是不理解为什么第一个环还在上面就可以把第二个环取下来。
大致类似于汉诺塔。这种想要处理第n个环就要把前面的n-1个环处理好,而且n还不大,很明显写个递归就可以了。
#include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; int tmp[15] = {1,1,1,1,1,1,1,1,1,1,1,1}; void f(int d){ if(tmp[d-1]); else f(d-1); for(int i=d-2;i>=1;i--){ if(tmp[i])f(i); } if(tmp[d]){ printf("%d DOWN\n",d); tmp[d] = 0; }else { printf("%d UP\n",d); tmp[d] = 1; } } int main(){ int n; scanf("%d",&n); for(int i=n;i>=1;i--) f(i); return 0; }