九连环是由九个彼此套接的圆环和一根横杆组成,九个环从左到右依次为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
010111111
思路:依次改变每一个环。
//程序名:新的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; }
原文:https://www.cnblogs.com/2006hanziwei/p/10718409.html