上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

高级汉诺塔问题分析

[复制链接]
  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-10-27 18:50:45 | 显示全部楼层 | 阅读模式

    题目如下

    给定一个数组arr,长度为N,arr中的值只有1,2,3三种
    arr[i]==1,代表汉诺塔问题中,从上往下第i个圆盘目前在左
    arr[i]==2,代表汉诺塔问题中,从上往下第i个圆盘目前在中
    arr[i] ==3,代表汉诺塔问题中,从上往下第i个圆盘目前在右
    那么arr整体就代表汉诺塔游戏过程中的一个状况
    如果这个状况不是汉诺塔最优解运动过程中的状况,返回-1
    如果这个状况是汉诺塔最优解运动过程中的状况,返回它是第几个状况

    假设有7层汉诺塔
    我们的函数参数设置为
    step(arr,index,from,to,other)
    其中arr是汉诺塔每层状态所在位置,index是该层序号,from是哪里来,to是去哪里,other为其他部分
    其中当index为-1的时候最优解应为0;
    而arr[index]==other部分理解较为复杂
    当7层汉诺塔,第7层应该由最左到最右
    如果出现在other则为中间,这是不可能的
    而假设7层在arr的状态还在左
    则上层的6层一定在左到中的步骤中
    不可能出现在other最右上

    而如果7层已经在最右了
    则其他层一定在中间,到最右的过程中
    此时不可能出现在最左

    每层的最优解都是确定且唯一的
    当下层的状态确定,一定会框住上一层的所处位置

    所以可以判断arr[index]==other一定为-1

    如果在from上
    则说明上层还没有搬完
    应该走入step(arr,index-1,from,other,to)l分支
    如果到了to上
    说明已经走完了
    应该将other上的搬到to上
    则是step(arr,index-1,other,to,from)
    并加上2的n次方-1+1,该公式为n-1层从from搬到other的步数

    于是得出了完整代码
    图片.png

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。

    该用户从未签到

    0

    主题

    25

    回帖

    20

    积分

    助理工程师

    积分
    20
    发表于 2024-10-27 21:18:19 | 显示全部楼层
    Js\Go\Java 全部修是吧
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    25

    回帖

    20

    积分

    助理工程师

    积分
    20
    发表于 2024-10-27 21:18:33 | 显示全部楼层
    Js\Go\Java 全部修是吧
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    25

    回帖

    20

    积分

    助理工程师

    积分
    20
    发表于 2024-10-27 21:19:06 | 显示全部楼层
    好像卡了 哈哈哈哈哈
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2024-10-27 22:00:44 | 显示全部楼层
    wuxin0011 发表于 2024-10-27 21:18
    Js\Go\Java 全部修是吧

    没办法的,看好像大家题解写算法都是java
    hhh
    我js写得多,拿js写更顺
    看别人题解就只能看jvav的
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    25

    回帖

    20

    积分

    助理工程师

    积分
    20
    发表于 2024-10-29 19:07:54 | 显示全部楼层

    打卡今日的每日一题,这题可以回溯,但是这样没意思

    class Solution {
        public List<String> validStrings(int n) {
            List<String> ans = new ArrayList<>();
            int mask = (1 << n) - 1;
            for(int i = 0;i < (1 << n);i++) {
                int x = (~i) & mask;
                int y = x >> 1;
                if((x & y)  == 0) {
                    ans.add(buildString(n,i));
                }
            }
            return ans;
        }
    
        public static String buildString(int n,int x) {
            char[] sk = new char[n];
            for(int i = 0;i < n;i++) {
                sk[n - i - 1] = (x >> i & 1) == 1 ? '1' : '0';
            }
            return new String(sk);
        }
    }
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表