C# 水排序 微信小游戏

news2025/2/25 15:52:04

来只 水排序谜题启发式搜索方法_水排序解法小程序-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

输出

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

再见,Visual Basic——曾经风靡一时的编程语言

2020年3月&#xff0c;微软团队宣布了对Visual Basic&#xff08;VB&#xff09;的“终审判决”&#xff1a;不再进行开发或增加新功能。这意味着曾经风光无限的VB正式退出了历史舞台。 VB是微软推出的首款可视化编程软件&#xff0c;自1991年问世以来&#xff0c;便受到了广大…

vue插件——vue-print-nb 实现打印功能

之前写过好多关于打印的功能&#xff0c;通过windowprint组合键来实现打印。 今天遇到一个需求&#xff0c;就是使用vue插件来实现打印功能。 最终效果图如下&#xff1a; 下面介绍解决步骤&#xff1a; 解决步骤1&#xff1a;安装vue-print-nb插件——npm install vue-p…

2024年,“智慧城市”到底是持续拉跨还是稳步向前?

2024年“智慧城市”的发展趋势&#xff0c;总体上来看&#xff0c;是稳步向前的。 随着科技的不断发展&#xff0c;特别是物联网、云计算、大数据、人工智能等技术的日益成熟和普及&#xff0c;智慧城市的建设有了更为坚实的基础。这些技术不仅可以帮助城市实现更高效、智能的…

智慧公厕让社区生活更美好

随着科技的迅猛发展&#xff0c;城市管理、城市服务均使用科技化的手段进行升级改造&#xff0c;社区生活更美好赋予全新的智慧效能&#xff0c;其中智慧公厕也成为了城市环卫设施的新宠。智慧公厕以物联网、互联网、大数据、云计算、5G通信、自动化控制等技术为核心&#xff0…

Leetcoder Day23| 回溯part03:组合+分割

语言&#xff1a;Java/Go 39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的所有不同组合 &#xff0c;并以列表形式返回。你可以按任意顺序返回这些组合。 candidates 中的同一个…

经典文献阅读之--Scale jump-aware pose graph...(尺度跳跃感知位姿图)

0. 简介 我们常说的位姿图松弛指的就是基于闭环检测的边进行位姿图优化。而位姿图松弛已成为SLAM中不可或缺的补充&#xff0c;能够在满足逐对相对变换约束的目标下&#xff0c;实现传感器参考帧的高效全局配准。这些约束可以通过增量运动估计或全局地点识别来给出。尽管后一种…

SpreadJS+vue3练手使用

SpreadJS的练手使用 // 首先在 package.json 这个文件里{"name": "app-admin","private": true,"version": "0.0.0","type": "module","scripts": {"dev": "vite",&quo…

el-submenu is-opened 展开/闭合;el-submenu is-opened保持一个子菜单的展开控制

写了个mes系统目录 点击子菜单展开后&#xff0c;上一级菜单没有默认关闭。主流后台管理系统大部分都是保持一个子菜单关闭状态、 问度娘无果后&#xff0c;查询官网&#xff0c;一个属性搞定。 unique-opened 是否只保持一个子菜单的展开 加在 <el-menu 组件上即可 完整代…

《品牌声量》开播啦!

11月7日&#xff0c;中国品牌人物高端访谈节目《品牌声量》将在中央新影老故事频道和央视频等平台陆续播出。 《品牌声量》栏目一档专注中国企业/行政区品牌建设的大型演播厅访谈节目。栏目以“汇聚品牌思想&#xff0c;提升品牌声量”为宗旨&#xff0c;采用“著名主持人权威…

平价护眼台灯推荐知乎,真人测评五大优质护眼台灯推荐

孩子的学习情况是父母最关心的话题之一&#xff0c;当然&#xff0c;孩子的学习环境也是十分重要的&#xff0c;只有保持明亮且舒适的光线环境才能让孩子获得高效率。因此护眼台灯的出现成为众多宝妈人群青睐的对象&#xff0c;都希望能借助它的力量来保护孩子的视力健康。然而…

python matplotlib-->柱形图

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 #https://blog.csdn.net/aobulaien001/article/details/134611729 import pandas as pd import numpy as np import matplotlib.pyplot as plt import randomclass TestPltText():def __init__(self):super(TestPltTex…

Java 学习和实践笔记(22):package(包机制)、JDK常见的包、类的导入

前面学的类&#xff0c;每创建一个类&#xff0c;在电脑上就是创建了一个对应的类文件。而package 相当于文件夹对文件的管理作用。主要用于管理类、用于解决类的重名问题。这个含义很简单。因为实际的程序&#xff0c;类可能有成千上万个&#xff0c;这样就需要把不同功能的类…

国创证券:沪指止步八连阳 市场上涨核心逻辑未变

2月26日&#xff0c;商场全天震荡调整&#xff0c;三大指数均小幅跌落。到收盘&#xff0c;上证指数收盘报2977.02点&#xff0c;跌落0.93%&#xff0c;停步八连阳&#xff1b;深证成指报收9066.09点&#xff0c;跌落0.04%&#xff1b;创业板指报收1751.7点&#xff0c;跌落0.3…

一款.NET下 WPF UI框架介绍

WPF开源的UI框架有很多,如HandyControl、MahApps.Metro、Xceed Extended WPF Toolkit™、Modern UI for WPF (MUI)、Layui-WPF、MaterialDesignInXamlToolkit、等等,今天小编带大家认识一款比较常用的kaiyuanUI---WPF UI,这款ui框架美观现代化,用起来也超级方便, 界面展示…

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

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

IP 电话

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

NoSQL数据库介绍

目录 一、发展历史 二、什么是NoSQL&#xff1f; 三、为什么使用NoSQL&#xff1f; 四、NoSQL vs. RDBMS 五、NoSQL的四种类型 键值存储 文档存储 列式存储 图形存储 六、NoSQL的优缺点 七、NoSQL的特点 灵活的可扩展性 灵活的数据模型 与云计算紧密融合 大数据量…

算法为什么难=》领悟学习方法论

原文参考&#xff1a;为什么算法这么难&#xff1f;&#xff1f;&#xff1f;_过程_逻辑_时候 广大码农同学们大多都有个共识&#xff0c;认为算法是个硬骨头&#xff0c;很难啃&#xff0c;悲剧的是啃完了还未必有用——除了面试的时候。实际工程中一般都是用现成的模块&…

基于uniapp大学生社团活动管理系统python+java+node.js+php微信小程序

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 语言&#xff1a;pythonjavanode.jsphp均支持 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 运行软件:idea/eclipse/vscod…

Flutter Version Manager (FVM): Flutter的版本管理终极指南

Flutter笔记 Flutter Version Manager (FVM) - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/136300307 my-websit…