九连环
题目描述
九连环是由九个彼此套接的圆环和一根横杆组成,九个环从左到右依次为1-9,每个环有两种状态:1和0。1表示环在杆上,0表示环不在杆上。初始状态是九个环都在杆上,即:111111111,目标状态是九个环都不在环上,即:000000000,由初始状态到目标状态的变化规则是:
(1)第一环为无论何时均可自由上下横行;
(2)第二只环只有在第一环为1时,才能自由上下;
(3)想要改变第n(n>2)个环的状态,需要先使第一到第(n-2)环均为下杆,且第n-1个环为上杆,而与第N+1个到第九环状态无关。
(4)每改变一个环,记为一步。
现在九连环由111111111变到000000000,求中间第I步的状态。
输入输出格式
输入格式:
一行,仅包含一个整数i。
输出格式:
一行,仅包含中间第i步的状态。如果输入的步数大于实际变换所需的步数,则输出-1。
输入输出样例
输入样例:
2
输出样例:
View Code
010111111
思路:依次改变每一个环。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//程序名:新的C++程序 //作者: #include<iostream> #include<fstream> #include<algorithm> using namespace std; int n; int a[10]={1,1,1,1,1,1,1,1,1,1}; void work(int m) { if(n==0) return; //步数为0结束 if(a[m-1]==0) work(m-1);//上一个环不符合状态,就改变它. for(int i=m-2;i>=1;i--) { if(a[i])work(i);//哪个环不符合状态,就改变它. } if(n==0) return;//步数为0结束 n--;//完成一步 a[m]=1-a[m];//改变这个环 } int main() { cin>>n; for(int i=9;i>=1;i--)if(a[i])work(i);//要改变最后一个环,得先调整前面环的状态,所以倒序运行,改变每一个环 if(n==0)for(int i=1;i<=9;i++)cout<<a[i];//判断步数超纲 else cout<<-1; return 0; }