题解九连环
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 + 高精