C# 水排序 微信小游戏

来只 水排序谜题启发式搜索方法_水排序解法小程序-CSDN博客

大神的C++语言转换成C# 语言,更多的请看原作者,这里直接贴C#代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApp2
{
    class Program
    {
        private const int NC = 12;
        private const int SIZE = 4;
        private static readonly List<string> vc = new List<string> { "黄色", "绿色", "翠绿", "青色", "蓝色", "紫色", "棕色", "橙色", "红色", "灰蓝", "褐色", "粉色" };
        private static List<List<int>> vm = new List<List<int>>();
        private static int[] avail = new int[NC];
        private static Dictionary<List<List<int>>, int> visit = new Dictionary<List<List<int>>, int>(new ListComparer());
        static void Main(string[] args)
        {
            Init();
            Dfs(0);
            OutVm();
            Console.ReadKey();
        }
        private static void OutMap()
        {
            for (int i = 0; i < vc.Count; i++)
            {
                Console.WriteLine(i + " " + vc[i] + "   ");
            }
        }

        private static void Input()
        {
            int a;
            Console.WriteLine("\n输入总试管数目");
            a = int.Parse(Console.ReadLine());
            vm = new List<List<int>>(new List<int>[a]);
            Console.WriteLine("依次输入各试管内颜色,从上往下,空的用-1补足");
            for (int i = 0; i < vm.Count; i++)
            {
                vm[i] = new List<int>();
                //for (int j = SIZE - 1; j >= 0; j--)
                //{
                    string xx = Console.ReadLine().ToString();
                    string[] xxs = xx.Split(' ');
                    for (int k = 0; k < xxs.Length; k++)
                    {
                        a = int.Parse(xxs[k].ToString());
                        if (a == -1) continue;
                        vm[i].Insert(0, a);
                        avail[a]++;
                    }
                //}
            }
        }

        private static bool Check()
        {
            for (int i = 0; i < NC; i++) if (avail[i] != 0 && avail[i] != SIZE) return false;
            return true;
        }

        private static void Init()
        {
            OutMap();
            do
            {
                Input();
            } while (!Check());
        }

        private static bool OneCol(List<int> vi)
        {
            for (int i = 1; i < vi.Count; i++)
            {
                if (vi[i] != vi[i - 1])
                {
                    return false;
                }
            }
            return true;
        }

        private static bool End()
        {
            return vm.All(vi => OneCol(vi));
        }

        private static bool CanPour(int i, int j)
        {
            if (i == j) return false;
            int si = vm[i].Count, sj = vm[j].Count;
            if (si == 0 || sj == SIZE) return false;
            if (sj == 0)
            {
                return !OneCol(vm[i]);
            }
            int ci = vm[i][si - 1], cj = vm[j][sj - 1];
            if (ci != cj) return false;
            int num = 0;
            for (int k = si - 1; k >= 0; k--) if (vm[i][k] == ci) num++;
                else break;
            return sj + num <= SIZE;
        }

        private static int Pour(int i, int j)
        {
            int x = 0;
            while (CanPour(i, j))
            {
                int it = vm[i].Count - 1;
                vm[j].Add(vm[i][it]);
                vm[i].RemoveAt(it);
                x++;
            }
            return x;
        }

        private static void PourF(int i, int j, int num)
        {
            while (num-- > 0)
            {
                int it = vm[i].Count - 1;
                vm[j].Add(vm[i][it]);
                vm[i].RemoveAt(it);
            }
        }

        private static bool Dfs(int deep)
        {
            if (visit.ContainsKey(vm)) return false;
            visit[vm] = 1;
            if (End() || deep > 40)
            {
                return true;
            }
            for (int i = 0; i < vm.Count; i++)
            {
                for (int j = 0; j < vm.Count; j++)
                {
                    if (!CanPour(i, j)) continue;
                    int x = Pour(i, j);
                    if (Dfs(deep + 1))
                    {
                        Console.WriteLine("\ndeep = " + deep + " from " + (i + 1) + " to " + (j + 1));
                        return true;
                    }
                    PourF(j, i, x);
                }
            }
            return false;
        }

        private static void OutVm()
        {
            Console.WriteLine();
            foreach (var vi in vm)
            {
                int si = vi.Count;
                for (int i = SIZE - 1; i >= 0; i--)
                {
                    if (i >= si) Console.Write("-1 ");
                    else Console.Write(vi[i] + " ");
                }
                Console.WriteLine();
            }
        }

        //public static void Main()
        //{
        //    Init();
        //    Dfs(0);
        //    OutVm();
        //}

        private class ListComparer : IEqualityComparer<List<List<int>>>
        {
            public bool Equals(List<List<int>> x, List<List<int>> y)
            {
                return x.SequenceEqual(y, new SequenceComparer<int>());
            }

            public int GetHashCode(List<List<int>> obj)
            {
                int hash = 17;
                foreach (var list in obj)
                {
                    foreach (var item in list)
                    {
                        hash = hash * 31 + item.GetHashCode();
                    }
                }
                return hash;
            }
        }

        private class SequenceComparer<T> : IEqualityComparer<IEnumerable<T>>
        {
            public bool Equals(IEnumerable<T> x, IEnumerable<T> y)
            {
                return x.SequenceEqual(y);
            }

            public int GetHashCode(IEnumerable<T> obj)
            {
                int hash = 17;
                foreach (var item in obj)
                {
                    hash = hash * 31 + item.GetHashCode();
                }
                return hash;
            }
        }

    }
}

测试

-1 -1 -1 -1
-1 -1 -1 -1
9 5 8 1
3 5 2 9
7 4 2 11
6 8 4 1
3 4 0 11
7 8 2 6
1 10 7 8
6 9 11 2
0 3 10 0
6 10 10 11
9 4 5 3
0 1 5 7

输出

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

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

相关文章

SImpAl

output matrix M&#xff0c;Curriculum using w ( x t , f , h ) w(x_t, f, h) w(xt​,f,h) 辅助信息 作者未提供代码

想露一手Linux命令,掌握这20个够用了!

中午好&#xff0c;我的网工朋友。 想做好网工&#xff0c;除了路由交换&#xff0c;掌握Linux操作系统也是很重要的。 因为很多服务器上都是用的Linux系统&#xff0c;要和服务器机器交互&#xff0c;就要通过Linux的相关命令。 正在找工作的朋友&#xff0c;如果面试时&am…

thinkphp6定时任务

这里主要是教没有用过定时任务没有头绪的朋友, 定时任务可以处理一些定时备份数据库等一系列操作, 具体根据自己的业务逻辑进行更改 直接上代码 首先, 是先在 tp 中的 command 方法中声明, 如果没有就自己新建一个, 代码如下 然后就是写你的业务逻辑 执行定时任务 方法写好了…

leetcode 2867. 统计树中的合法路径数目【筛质数+贡献法】

原题链接&#xff1a;2867. 统计树中的合法路径数目 题目描述&#xff1a; 给你一棵 n 个节点的无向树&#xff0c;节点编号为 1 到 n 。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi] 表示节点 ui 和 vi 在树中有一条边。 …

openai sora 只能根据文本生成视频?不,TA 是通用物理世界模拟器

视频生成模型作为世界模拟器 我们探索了在视频数据上进行大规模生成模型的训练。 具体来说&#xff0c;我们联合在可变持续时间、分辨率和长宽比的视频和图像上训练文本条件扩散模型。 我们利用了一个在视频和图像潜在编码的时空补丁上操作的变压器架构。 我们最大的模型So…

请求包的大小会影响Redis每秒处理请求数量

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容压测规划客户端长连接数量对性能的影响请求包大小的影响Pipleline模式对Redis的影响 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领…

CG-0A 电子水尺可实现对水位数据的连续自动监测

CG-0A 电子水尺可实现对水位数据的连续自动监测产品概述 本产品是一种采用微处理器芯片为控制器&#xff0c;内置通讯电路的数字式水位传感器&#xff0c;具备高的可靠性及抗干扰性能。适用于江、河、湖、水库及蓄水池、水渠等处的水位测量使用。 本产品采用了生产工艺技术&…

springboot集成kafka快速入门demo

一、kafka介绍 Kafka是一种基于分布式发布-订阅消息系统的开源软件。 其目标是提供高吞吐量、低延迟、可扩展性和容错能力。 Kafka中将消息存储在可配置数量的分区中&#xff0c;以便实现横向扩展&#xff0c;并且支持多个生产者和消费者&#xff0c;具有良好的可靠性保证机制。…

【精选】Java面向对象进阶——静态内部类和局部内部类

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

SpringCloud有哪些组件

什么是SpringCloud&#xff1f; Spring Cloud是基于Spring Boot的分布式系统开发工具&#xff0c;它提供了一系列开箱即用的、针对分布式系统开发的特性和组件&#xff0c;用于帮助开发人员快速构建和管理云原生应用程序。 Spring Cloud的主要目标是解决分布式系统中的常见问题…

FL Studio Fruity Edition2024中文入门版Win/Mac

FL Studio Fruity Edition2024是一款功能强大的音乐制作软件&#xff0c;适合初学者和音乐爱好者使用。它提供了丰富的音乐制作工具&#xff0c;包括音频录制、编辑、混音以及MIDI制作等功能&#xff0c;帮助用户轻松创作出动人的音乐作品。 FL Studio 21.2.3 Win-安装包下载如…

Linux之定时任务①(实施必会!!!)

文章目录 常见脚本一、 什么是crond二、crond的使用场景一、apache服务器监控三、crond服务四、命令格式五、cron格式六、定时任务备份七、数据库定时备份八、使用shell脚本发送邮件 常见脚本 [rootlocalhost ~]# vim apacheSentry.sh#!/bin/bash # author: tt # description:…

DAY34--learning English

一、积累 1.listless 2.sanction 3.inflict 4.stung 5.droplet 6.rot 7.soil 8.welfare 9.flock 10.mitigate 11.incubation 12.feces 13.urine 14.odor 15.sprinkle 16.guresome 17.slaughter 18.antibiotic 19.certify 20.tray 二、练习 1.牛津原译 Listless adj. /ˈlɪst…

【毛毛讲书】【老而不衰的科学】长寿的秘诀究竟是什么?

重磅推荐专栏&#xff1a; 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域&#xff0c;包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用&#xff0c;以及与之相关的人工智能生成内容&#xff…

用GGUF和Llama .cpp量化Llama模型

用GGUF和Llama .cpp量化Llama模型 什么是GGML如何用GGML量化llm使用GGML进行量化NF4 vs. GGML vs. GPTQ结论 由于大型语言模型&#xff08;LLMS&#xff09;的庞大规模&#xff0c;量化已成为有效运行它们的必要技术。通过降低其权重的精度&#xff0c;您可以节省内存并加快推理…

IP 电话

1 IP 电话概述 IP 电话是在互联网上传送多媒体信息。 多个英文同义词&#xff1a; VoIP (Voice over IP) Internet Telephony VON (Voice On the Net) 1.1 狭义的和广义的 IP 电话 狭义的 IP 电话&#xff1a;指在 IP 网络上打电话。 广义的 IP 电话&#xff1a;不仅仅是…

二 线性代数-向量

1、向量的表示方法&#xff1a; 其中的 i、j、k是坐标轴方向的单位向量。 2、向量的模&#xff1a; 用坐标计算的方法&#xff1a; 3、向量的运算&#xff1a; 3.1 向量的加法减法&#xff1a; 3.2 向量的数乘&#xff1a; 拉格朗日乘数法的 基础 公式。 3.3 向量的数量积&a…

分布式ID生成方案详解

✨✨ 祝屏幕前的您天天开心 &#xff0c;每天都有好运相伴。我们一起加油&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. UUID&#xff08;Universally …

mysql的增删改查(常用)

增(insert) 语法&#xff1a; insert into 表名&#xff08;字段&#xff09; values( 字段对应的值) 案例&#xff1a; 创建一个学生表 结构如下&#xff1a; create table student(id int ,name varchar(20),age int); 向表中插入2条数据 create table student(id int ,n…

设计模式-结构型模式-组合模式

组合模式&#xff08;Composite Pattern&#xff09;&#xff1a;组合多个对象形成树形结构以表示具有“部分—整体”关系的层次结构。组合模式对单个对象&#xff08;即叶子对象&#xff09;和组合对象&#xff08;即容器对象&#xff09;的使用具有一致性&#xff0c;又可以称…