C#,蛇梯问题(Snake and Ladder Problem)的算法与源代码

1 蛇梯问题

Snake and Ladder Problem

给定一个蛇梯板,找出从源单元格或第一个单元格到达目标单元格或最后一个单元格所需的最小掷骰次数。基本上,玩家可以完全控制掷骰子的结果,并希望找出到达最后一个单元格所需的最小掷骰次数。

如果玩家到达的牢房是梯子的底部,玩家必须爬上梯子,如果到达的牢房是蛇的嘴,则必须在不掷骰子的情况下下下到蛇的尾巴。

例如,考虑所示的电路板,从单元1到达单元30所需的最小掷骰子次数为3。

以下是步骤:

a) 首先掷两个骰子到3号牢房,然后爬到22号牢房

b) 然后掷6到28。

c) 最终通过2达到30。

还有其他解决方案,如(2,2,6),(2,4,4),(2,3,5)。。等

其思想是将给定的蛇梯板视为顶点数等于板中单元数的有向图。问题归结为在图中寻找最短路径。如果接下来的6个顶点没有蛇或阶梯,则图的每个顶点都有一条到下6个顶点的边。如果接下来的六个顶点中有任何一个具有蛇或阶梯,则当前顶点的边将到达阶梯的顶部或蛇的尾部。由于所有边的权重相等,我们可以使用图的宽度优先搜索有效地找到最短路径。

以下是上述想法的实施情况。输入由两个东西表示,第一个是“N”,它是给定电路板中的单元数,第二个是大小为N的数组“move[0…N-1]”。如果没有snake,也没有来自i的梯形图,则条目move[i]为-1,否则move[i]包含snake或位于i的梯形图的目标单元索引。

2 源程序

using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    public class Entry
    {
        public int v { get; set; } = 0;
        public int dist { get; set; } = 0;
        public Entry()
        {
        }
    }

    public class Snakes_Ladder_Problem
    {
        public static int Minium_Dice_Throws(int[] move)
        {
            int n = move.Length;
            int[] visited = new int[n];
            Queue<Entry> q = new Queue<Entry>();
            Entry qe = new Entry();

            visited[0] = 1;
            q.Enqueue(qe);

            while (q.Count != 0)
            {
                qe = q.Dequeue();
                int v = qe.v;

                if (v == (n - 1))
                {
                    break;
                }
                for (int j = v + 1; j <= (v + 6) && j < n; j++)
                {
                    if (visited[j] == 0)
                    {
                        Entry a = new Entry();
                        a.dist = (qe.dist + 1);
                        visited[j] = 1;

                        if (move[j] != -1)
                        {
                            a.v = move[j];
                        }
                        else
                        {
                            a.v = j;
                        }
                        q.Enqueue(a);
                    }
                }
            }

            return qe.dist;
        }
    }
}
 

3 源代码

using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    public class Entry
    {
        public int v { get; set; } = 0;
        public int dist { get; set; } = 0;
        public Entry()
        {
        }
    }

    public class Snakes_Ladder_Problem
    {
        public static int Minium_Dice_Throws(int[] move)
        {
            int n = move.Length;
            int[] visited = new int[n];
            Queue<Entry> q = new Queue<Entry>();
            Entry qe = new Entry();

            visited[0] = 1;
            q.Enqueue(qe);

            while (q.Count != 0)
            {
                qe = q.Dequeue();
                int v = qe.v;

                if (v == (n - 1))
                {
                    break;
                }
                for (int j = v + 1; j <= (v + 6) && j < n; j++)
                {
                    if (visited[j] == 0)
                    {
                        Entry a = new Entry();
                        a.dist = (qe.dist + 1);
                        visited[j] = 1;

                        if (move[j] != -1)
                        {
                            a.v = move[j];
                        }
                        else
                        {
                            a.v = j;
                        }
                        q.Enqueue(a);
                    }
                }
            }

            return qe.dist;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/447004.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【大厂AI课学习笔记NO.76】人工智能人才金字塔

人工智能领域&#xff0c;分为源头创新人才、产业研发人才、应用开发人才和实用技能人才。 人工智能领域的人才结构呈现多样化特点&#xff0c;主要可以分为源头创新人才、产业研发人才、应用开发人才和实用技能人才四大类。这四大类人才在人工智能领域的发展中各自扮演着不可或…

Day30:安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计

目录 环境搭建-NodeJS-解析安装&库安装 功能实现-NodeJS-数据库&文件&执行 安全问题-NodeJS-注入&RCE&原型链 案例分析-NodeJS-CTF题目&源码审计 开发指南-NodeJS-安全SecGuide项目 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&…

常见排序算法(C/C++)--- 动画演示

本篇将介绍一些常见的排序算法&#xff0c;如插入排序&#xff1a;直接插入排序、希尔排序&#xff1b;选择排序&#xff1a;选择排序、堆排序&#xff1b;交换排序&#xff1a;快速排序、冒泡排序&#xff1b;以及最后的归并排序。 对于以上的排序算法&#xff0c;我们总结了每…

VScode的列选

可以用来优化代码排布&#xff0c;让变量整齐成为一排 一、批量复制&#xff1a; 在1处左键单击&#xff0c;然后摁住SHIFTALT键的同时&#xff0c;左键单击2处&#xff0c;即可复制一整块的内容 如果所示 就可以复制了 二、批量输入 在1处左键单击&#xff0c;然后摁住SHI…

Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

目录 JavaEE-HTTP-Servlet&路由&周期 JavaEE-数据库-JDBC&Mybatis&库 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架…

RabbitMQ - 04 - Fanout交换机 (广播)

目录 部署demo项目 什么是Fanout交换机 实现Fanout交换机 1.控制台 声明队列 声明交换机 将交换机与队列绑定 2.编写消费者方法 3.编写生产者测试方法 部署demo项目 通过消息队列demo项目进行练习 相关配置看此贴 http://t.csdnimg.cn/hPk2T 注意 生产者消费者的…

转移表回调函数实现

回调函数实现 计算器的模拟&#xff08;函数指针数组的使用&#xff09;&#xff08;回调函数&#xff09; 简化 冗余 老的代码的问题就是 冗余 写死 不能完成不同的任务 函数调用的时候只需要知道地址就可以 calc计算器 这里也称之为转移表 #define _CRT_SECURE_NO_WAR…

微信小程序开发系列(二十五)·wxml语法·条件渲染wx:if, wx:elif, wx:else 属性组以及hidden 属性的使用

目录 1. 使用 wx:if、wx:elif、wx:else 属性组 2. 使用 hidden 属性 条件渲染主要用来控制页面结构的展示和隐藏,在微信小程序中实现条件渲染有两种方式: 1. 使用 wx:if, wx:elif, wx:else 属性组 2. 使用 hidden 属性 wx:if 和 hidden 二者的区别&#xff1a; 1. wx…

计算机网络-第4章 网络层(2)

主要内容&#xff1a;网络层提供的两种服务&#xff1a;虚电路和数据报&#xff08;前者不用&#xff09;、ip协议、网际控制报文协议ICMP、路由选择协议&#xff08;内部网关和外部网关&#xff09;、IPv6,IP多播&#xff0c;虚拟专用网、网络地址转换NAT&#xff0c;多协议标…

背包问题算法

背包问题算法 0-1背包问题二维数组一维数组 完全背包问题二维数组一维数组 多重背包问题一维数组 0-1背包问题 问题&#xff1a;背包的容量为9&#xff0c;有重量分别为[2, 4, 6, 9]的四个物品&#xff0c;价值分别为[3, 4, 5, 6]&#xff0c;求背包能装的物品的最大价值是多少…

构建LVS集群

一、集群的基本理论&#xff08;一&#xff09;什么是集群 人群或事物聚集&#xff1a;在日常用语中&#xff0c;群集指的是一大群人或事物密集地聚在一起。例如&#xff0c;“人们群集在广场上”&#xff0c;这里的“群集”是指大量人群聚集的现象。 计算机技术中的集群&…

C语言连接【MySQL】

稍等更新图片。。。。 文章目录 安装 MySQL 库连接 MySQLMYSQL 类创建 MySQL 对象连接数据库关闭数据库连接示例 发送命令设置编码格式插入、删除或修改记录查询记录示例 参考资料 安装 MySQL 库 在 CentOS7 下&#xff0c;使用命令安装 MySQL&#xff1a; yum install mysq…

arcgis栅格数据处理3——定义投影(同样适用于其他类型文件)

进行数据连接时可能出现未设置投影无法链接的情况&#xff0c;需要先定义投影 点击最右侧“目录”&#xff0c;弹出带有系统工具的面板&#xff0c;点击“data management tools”点击“投影”&#xff0c;“定义投影”

【轮式平衡机器人】——TMS320F28069片内外设之eCAP

引入 TMS320F28069的eCAP&#xff08;增强型捕获模块&#xff09;是一个强大的外设&#xff0c;用于精确测量和捕获输入信号的事件和时间戳。 在电机控制、传感器数据采集和信号处理等应用中&#xff0c;eCAP模块可以用于测量霍尔传感器、编码器或其他数字输入信号的周期、频…

计算表达式x*(2^i)的值math.ldexp(x, i)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算表达式x*(2^i)的值 math.ldexp(x, i) [太阳]选择题 关于以下代码输出的结果说法正确的是&#xff1f; import math print("【执行】math.ldexp(3,2)") print(math.ldexp(3,2)) …

2024/3/10总结:数据结构教程:顺序表的创建以及基本的12个操作

首先&#xff0c;按照惯例&#xff0c;欢迎大家边听歌边看本博客&#xff01;&#xff01;&#xff01; 这里是神奇的赛尔号_张杰 (kugou.com) 一.背景&#xff1a;由于是上机实验&#xff0c;直接引用数据结构教程第6版73页的实验题1 修改第6&#xff0c;7&#xff0c;8&am…

CI/CD笔记.Gitlab系列:控制台强制修改root用户密码

CI/CD笔记.Gitlab系列 控制台强制修改root用户密码 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.cs…

SpringBoot中的上传文件接口

SpringBoot中的上传文件 上传文件的操作在有些功能中属于比较常用的环节&#xff0c;这里整理下SpringBoot环境中上传文件的实现方式。 这里实现的是上传文件的后台接口&#xff0c;前端部分可以用测试工具模拟实现&#xff0c;就先不在这里表述了。 Dto层 使用MultipartFile…

【C++】类和对象(六个默认成员函数)

文章目录 类的六个默认成员函数**构造函数****构造函数的目的****构造函数的特性** 析构函数析构函数概念析构函数处理的顺序析构函数清理细节 拷贝构造函数拷贝构造函数典型调用场景 赋值运算符重载运算符重载赋值运算重载前置和后置 重载 const成员函数再提权限的问题: 取地址…

Guiding Large Language Models viaDirectional Stimulus Prompting

1. 通过定向刺激提示指导大语言模型 论文地址&#xff1a;[2302.11520] Guiding Large Language Models via Directional Stimulus Prompting (arxiv.org) 源码地址&#xff1a;GitHub - Leezekun/Directional-Stimulus-Prompting: [NeurIPS 2023] Codebase for the paper: &qu…