九连环

题目描述

九连环是由九个彼此套接的圆环和一根横杆组成,九个环从左到右依次为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;
}
View Code

 

 
posted @ 2019-04-16 17:14  背‘水’一栈  阅读(605)  评论(0编辑  收藏  举报