九连环

Problem a: 九连环(ring)

Description

九连环是由九个彼此套接的圆环和一根横杆组成,九个环从左到右依次为l~9,每个环有两种状 态:1和0,1表示环在杆上,0表示环不在杆上。初始状态是九个环都在杆上,即:111111111,目标状态是九个环都不在杆上,即:000000000,由初始状态到目标状态的变化规则是:
(1)第一环为无论何时均可自由上下横行;
(2)第二只环只有在第一环为1时,才能自由上下;
(3)想要改变第n(n>2)个环的状态,需要先使第一到第(n-2)环均为下杆,且第n-1个环为上杆,而与第n+l个到第九环状态无关;
(4)每改变一个环,记为一步。
现在九连环由111111111变到000000000,求中间第i步的状态。

Input

  仅包含一个整数i。

Output

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

Sample Input

2
500

Sample Output

010111111
-1

HINT

解题思路:

直接按照解九连环的步骤用递归模拟。(一个up函数,一个down函数,互相调用),打表就可以。可以发现解九连环连350步都用不到,代码可以修改为任意连环。

注意:题目的描述比较坑,说的是输入仅有一个i,其实有多组输入数据,大家看测试示例就明白了。(本人因为没注意WA六次,233333333。。。。。。)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;

int huan[10]= { 1,1,1,1,1,
                1,1,1,1,1};
int res[400][10] = {0};
int n = 9;
int step = 0;
int sum = 0;
void cut(int a[])//每步统计并存储在res中。
{
    for(int i = 1; i <= n; i++)
        res[sum][i] = a[i];
    sum ++;
}

void up(int, int);
void down(int n, int s)//取下前n个环
{
    if(n == 1)
    {
        huan[1] = 0;
        cut(huan);
        return;
    }
    if(n == 2)
    {
        huan[2] = 0;
        cut(huan);
        huan[1] =0;
        cut(huan);
        return;
    }

    down(n-2,step);
    huan[n] = 0;
    cut(huan);
    up(n-2,step);
    down(n-1,step);
}
void up(int n, int s)//挂上前n个环
{
    if(n == 1)
    {
        huan[1] = 1;
        cut(huan);
        return;
    }
    if(n == 2)
    {
        huan[1] = 1;
        cut(huan);
        huan[2] =1;
        cut(huan);
        return;
    }
    up(n-1,step);
    down(n-2,step);
    huan[n] = 1;
    cut(huan);
    up(n-2,step);
}

int main()
{
    while(cin>>step)
    {
    cut(huan);
    down(n,step);

   // cout<<sum<<endl;
    if(step > sum - 1)
        cout<<-1<<endl;
    else
    {
        for(int i = 1; i <=n; i++)
            cout<<res[step][i];
        cout<<endl;
    }
sum = 0;
    memset(res,0,sizeof(res));
    for(int i = 0; i < 10; i++)
        huan[i]= 1;
    }

    return 0;
}

  

时间: 2024-07-28 14:41:23

九连环的相关文章

Android版九连环NineRings

喜欢九连环以及想玩九连环的小伙伴们,送福利了,Android版本的九连环小游戏NineRings上线了!!!快来尝鲜吧,如果觉得好玩,请帮忙转发.游戏演示及下载地址 http://onestraw.net/ninerings 91助手下载: http://url.cn/W4R4Eo 百度助手下载: http://url.cn/PhqcRq 安卓市场下载: http://url.cn/JgDfoN Android版九连环NineRings,布布扣,bubuko.com

Android版九连环NingRings

喜欢九连环以及想玩九连环的小伙伴们,送福利了,Android版本的九连环小游戏上线了!!!快来尝鲜吧,如果觉得好玩,请帮忙转发.游戏演示及下载地址http://onestraw.net/ninerings NineRings是根据中国古典益智游戏九连环规则,抽象出来的一款休闲益智游戏! NineRings是第一款将九连环玩具在手机上(Android)模拟出来的游戏,九连环爱好者终于可以随时随地把玩九连环了. NineRings游戏界面中有一根柱子和多个方块,方块位于柱子的左侧,方块从上往下依次标

九连环-递归解法

//求取下n环和放上n环的步数 int ans; //规则一:第一环可以在任何时候放上或取下环柄. //规则二:只有紧跟在领头环后的环可以放上或取下环柄.(领头环是套在柄上的最前面的环 int DownRing(int); int UpRing(int); int DownRing(int n) { int res = 0; if(n == 1) return 1; if(n>2) res = (res + DownRing(n-2))%SMod; //移下n-2个,第n-1个变为领头环 res

asp.net 实现“九连环”小游戏

wildcatsky(原作) public Class ChinaRing1 Inherits System.Web.UI.Page #Region " Web 窗体设计器生成的代码 " '该调用是 Web 窗体设计器所必需的. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent() End Sub Protected WithEvents ChinaRingCkBox1 As

九连环分析与实现

其实九连环的分析很简单,我们看下图分析,思路就十分清晰了,图如下 要取掉这个九连环必须从最低层开始,也就是2或者3环开始,这就涉及到你要取环是单数还是双数,如果输入的双数,那你就从2环开始取下,如果是单数,那得从1环开始,所以,得先判断然后再递归,if(n==1) {DownOne(1)} else if(n==2) {DownOne(2);DownOne(1);}然后才是第3种情况开始的递归取,假设这个n是5,你要取掉5,那么你必须取掉5-2之前的环也就是第3个环,DownAll(n-2),现

九连环解法( 基于递归 )

前不久拿到一套九连环,在解开过程中发现就是一个不断递归的过程,而经过抽象后,发现九连环可以理解成简化的横置版汉诺塔.递归的计算,计算机可是比人快多了,那么计算机怎么实现? 这段小代码不仅限于九连环,所以自称类九连环.代码如下. #include <iostream> using namespace std;void LoopDown ( int num ) ;void CircleDown ( int num ) ;void LoopUp ( int num ) ;void CircleUp

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目: Problem Description Dumbear likes to play the Chinese Rings (Baguenaudier). It’s a game played with nine rings on a bar. The rules of this game are very simple: At first, the nine rings are all

【题解】九连环

题目描述 九连环是由九个彼此套接的圆环和一根横杆组成,九个环从左到右依次为1-9,每个环有两种状态:1和0.1表示环在杆上,0表示环不在杆上.初始状态是九个环都在杆上,即:111111111,目标状态是九个环都不在环上,即:000000000,由初始状态到目标状态的变化规则是: (1)第一环为无论何时均可自由上下横行: (2)第二只环只有在第一环为1时,才能自由上下: (3)想要改变第n(n>2)个环的状态,需要先使第一到第(n-2)环均为下杆,且第n-1个环为上杆,而与第N+1个到第九环状态无

[CQOI 2018]九连环

Description 题库链接 给你一个 \(n\) 连环,游戏规则是: 第一个(最右边)环任何时候都可以任意装上或卸下: 如果第 \(k\) 个环没有被卸下,且第 \(k\) 个环右边的所有环都被卸下,则第 \(k+1\) 个环(第 \(k\) 个环左边相邻的环)可以任意装上或卸下. 现在 \(m\) 组询问,每组询问给你 \(n\) 连环,问你至少多少步取下所有的环. \(1\leq n\leq 10^5,1\leq m\leq 10\) Solution 数学书上推导很清楚了: 值得注意