九连环问题

题目描述

九连环是一种源于中国的传统智力游戏,有九个金属环套在上方一个由金属丝做成的环杆上,并且互相牵连。

九个环从左到右依次为 ~1~9,每个环有两种状态:1 和 0,1 表示环在杆上,0 表示环不在杆上。

初始状态是九个环都在杆上,即:111111111,目标状态是九个环都不在杆上,即:000000000,下图中的状态为 110000000

由初始状态到目标状态的变化规则是: 

  • (1)第一只环为无论何时均可自由上下横行; 
  • (2)第二只环只有在第一环为 1 时,才能自由上下; 
  • (3)想要改变第 n(n>2)个环的状态,需要先使第一到第( n-2 )环均为下杆,且第 n  1 个环为上杆,而与第n+1 个到第九环状态无关; 
  • (4)每改变一个环,记为一步。 

输入

输入有若干行,每行一个整数 i 。

输出

输出若干行,每行仅包含中间第 i步的状态。如果输入的步数大于实际变换所需的步数,则输出-1。

AC代码

#include<iostream>
using namespace std;
int step,num;
string e_nd="100000000";
string st_a="111111111";
string ans[500]={"111111111"};

void turn(int n){
	if(e_nd==st_a) return;
	if(st_a[n-1]=='0') turn(n-1);
	for(int i=n-2;i>=1;i--){
		if(st_a=='1')turn(i);
	}
	st_a[n]=(st_a[n]=='1'?'0':'1');
	ans[++step]=st_a.substr(1,9);
}
int main(){
	cin>>a>>num;
	for(int i=9;i>1;i--){
		turn(i);
	}
	if(a>step) cout<<-1<<endl;
	else cout<<ans[a]<<endl;
return 0;
}

运行结果(暂不展示)

完结撒花✿✿ヽ(°▽°)ノ

众所周知,只要用你那招财的小手为我点上一个免费的赞,你将会得到一串代码:

age=18;

while(true){

happy++,luck++,unhappy--;

}

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值