题解九连环

Posted kcn999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解九连环相关的知识,希望对你有一定的参考价值。

题目描述

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

 

题解

        根据题意模拟即可。

技术图片
#include<iostream>

using namespace std;

int I;
int a[10]={1,1,1,1,1,1,1,1,1,1};

void Work(int obj)
{
    if(!I) return;
    
    if(!a[obj-1]) Work(obj-1);
    for(int i=obj-2;i>=1;i--)
    {
        if(a[i]) Work(i);
    }
    
    if(!I) return;//防止某些情况
    I--;
    a[obj]=(a[obj]+1)%2;
}


int main()
{
    cin>>I;
    
    for(int i=9;i>=1;i--)
    {
        if(a[i]) Work(i);
    }
    
    if(!I)
    {
        for(int i=1;i<=9;i++)
        {
            cout<<a[i];
        }
    }
    else
    {
        cout<<-1;
    }
    
    return 0;
}
参考程序

 

以上是关于题解九连环的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ5300 [Cqoi2018]九连环 dp + 高精

品优购dubbox文档bug连环计,还是自己敲最实在!!!!!!

九连环全套解法图解

Java 求解划分字母区间

[CQOI 2018]九连环

Chinese Rings (九连环+矩阵快速幂)