zoukankan      html  css  js  c++  java
  • [dfs] 洛谷 P1242 新汉诺塔

    题目描述

    设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号。将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A、B、C,这个状态称为初始状态。

    现在要求找到一种步数最少的移动方案,使得从初始状态转变为目标状态。

    移动时有如下要求:

    ·一次只能移一个盘;

    ·不允许把大盘移到小盘上面。

    输入输出格式

    输入格式:
    文件第一行是状态中圆盘总数;

    第二到第四行分别是初始状态中A、B、C柱上圆盘的个数和从上到下每个圆盘的编号;

    第五到第七行分别是目标状态中A、B、C柱上圆盘的个数和从上到下每个圆盘的编号。

    输出格式:
    每行一步移动方案,格式为:move I from P to Q

    最后一行输出最少的步数。

    输入输出样例

    输入样例#1:
    5
    3 3 2 1
    2 5 4
    0
    1 2
    3 5 4 3
    1 1
    输出样例#1:
    move 1 from A to B
    move 2 from A to C
    move 1 from B to C
    move 3 from A to B
    move 1 from C to B
    move 2 from C to A
    move 1 from B to C
    7
    说明

    圆盘总数≤45

    题解

    首先要将第n个盘子从x到y
    那么就要把比n小的盘子全部移到6-x-y
    然后将n移到y
    

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int a[101],b[101],n;
    long long ans;
    void dfs(int x,int dep)
    {
        if (a[x]==dep) return;
        for (int i=x-1;i>=1;i--) dfs(i,6-dep-a[x]);
        printf("move %d from %c to %c
    ",x,a[x]+64,dep+64);
        a[x]=dep;
        ans++;
    }
    int main()
    {
        int x,d;
        cin>>n;
        cin>>x;
        for (int i=1;i<=x;i++)
        {
            scanf("%d",&d);
            a[d]=1;
        }
        cin>>x;
        for (int i=1;i<=x;i++)
        {
            scanf("%d",&d);
            a[d]=2;
        }
        cin>>x;
        for (int i=1;i<=x;i++)
        {
            scanf("%d",&d);
            a[d]=3;
        }
        cin>>x;
        for (int i=1;i<=x;i++)
        {
            scanf("%d",&d);
            b[d]=1;
        }
        cin>>x;
        for (int i=1;i<=x;i++)
        {
            scanf("%d",&d);
            b[d]=2;
        }
        cin>>x;
        for (int i=1;i<=x;i++)
        {   
            scanf("%d",&d);
            b[d]=3;
        }
        for (int i=n;i>=1;i--) dfs(i,b[i]);
        cout<<ans;
    }
  • 相关阅读:
    【转载】消息队列使用的四种场景介绍
    Vue项目部署打包
    创建Vue项目vue-cli &#183; Failed to download repo vuejs-templates/webpack: connect ETIMEDOUT
    数据库错误:ORA-12154
    oracle数据库一条sql语句批量插入数据
    Linux time scap
    winscp不能使用root登录
    Linux find ./ -name *.bak | xargs rm -rf
    Linux命令echo 3 > /proc/sys/vm/drop_caches
    redis查看服务器占用端口
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412218.html
Copyright © 2011-2022 走看看