递归算法之九连环操作步骤

import java.util.ArrayList;
import java.util.Scanner;
/**
 * 九连环的装卸需要遵守两个规则。
 * 1、第一个(最右边)环任何时候都可以装上或卸下。
 * 2、如果第k个环没有被卸下,且第k个环右边的所有环都被卸下,则第k+1个环(第k个环左边相邻的环)可以任意装上或卸下。
 */
public class NineInterlockingLinks2 {
    private static int numberOfSteps = 0;

    public static void main(String[] args) {
        System.out.print("请输入环数,按回车键:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Node[] node = new Node[n + 1];

        for (int i = 1; i < n + 1; i++)
            node[i] = new Node(i, 1);
        ArrayList<Node> list = new ArrayList();
        for (int j = n; j > 0; j--)
            list.add(node[j]);

        NineInterlockingLinks2 nc = new NineInterlockingLinks2();
        for (int t = n; t > 0; t--)
            nc.play(node, list, t);

        System.out.println(n + "连环总步数:" + NineInterlockingLinks2.numberOfSteps);
    }

    public static void move(Node node) {
        NineInterlockingLinks2.numberOfSteps++;

        //1 在九连环上;0 在九连环下
        if (node.state == 1)
            System.out.println("下 " + node.num);
        else
            System.out.println("上 " + node.num);
    }

    public void play(Node[] node, ArrayList<Node> list, int n) {
        boolean deal = false;

        if (n == 1) {
            if (node[n].state == 1) {
                move(node[n]);// move the 1st;
                node[n].state = 0;
                list.remove(list.size() - 1);
            } else {
                move(node[n]);
                node[n].state = 1;
                list.add(node[n]);
            }
        } else {
            while (!deal) {
                if (node[n - 1].state == 1) {//前一环在上
                    if (list.get(list.size() - 1).num == n - 1)//前一环为栈顶
                    {
                        if (node[n].state == 1) {
                            move(node[n]);
                            node[n].state = 0;
                            deal = true;
                            list.remove(list.size() - 2);
                        } else {
                            move(node[n]);
                            node[n].state = 1;
                            deal = true;
                            list.add(list.size() - 1, node[n]);
                        }
                    } else//前一环在上,但是前一环不是栈顶
                    {
                        int index = 1;
                        for (int i = n - 2; i > 0; i--)//找到前一环之前的所有在上的环中最大的一个。
                        {
                            if (node[i].state == 1) {
                                index = i;
                                break;
                            }
                        }
                        play(node, list, index);//将前一环之前的在上的最大的一环移走
                    }
                }
                //-------------------------------------------------------------------------
                else if (node[n - 1].state == 0) {//前一环不在上
                    play(node, list, n - 1);
                }
            }
        }
    }

}

class Node {
    int num;
    int state;//1 在九连环上;0 在九连环下

    public Node(int num, int state) {
        this.num = num;
        this.state = state;
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值