首页 > 编程语言 >数独解密小程序

数独解密小程序

时间:2024-07-30 09:50:31浏览次数:9  
标签:int 程序 解密 数独板 board row col 数独 size

本程序为C#控制台(.Net Framework 目标框架)
使用方法在data.csv中填好已有的数据,需要解密的数据空着不填。

using System;
using System.Diagnostics;
using System.IO;

namespace 数独解密
{
    class Program
    {
        static void Main()
        {
            // 动态确定数独板的大小
            int size = GetBoardSizeFromCsv("data.csv");

            // 创建一个动态大小的二维数组来表示数独板
            int[,] board = new int[size, size];

            // 从CSV文件读取数独板的初始值
            ReadFromCsv(board, "sudoku.csv");

            // 创建一个 Stopwatch 实例用于计时
            Stopwatch stopwatch = new Stopwatch();

            // 开始计时
            stopwatch.Start();

            // 调用递归函数尝试解决数独
            if (SolveSudoku(board, size))
            {
                // 如果成功解决数独,则打印结果
                PrintBoard(board, size);
            }
            else
            {
                // 如果没有解,则打印消息
                Console.WriteLine("没有解");
            }

            // 停止计时
            stopwatch.Stop();

            // 输出耗时
            Console.WriteLine($"耗时: {stopwatch.Elapsed.TotalMilliseconds} 毫秒");

            Console.ReadKey();
        }

        // 从CSV文件中获取数独板的大小
        static int GetBoardSizeFromCsv(string filePath)
        {
            int maxValue = 0; // 初始化最大值为0
            using (var reader = new StreamReader(filePath))
            {
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine(); // 读取一行
                    var values = line.Split(','); // 按逗号分割该行

                    // 遍历该行中的每个值
                    foreach (var value in values)
                    {
                        if (!string.IsNullOrEmpty(value)) // 如果值不为空
                        {
                            int num = int.Parse(value); // 将字符串转换为整数
                            if (num > maxValue) // 更新最大值
                            {
                                maxValue = num;
                            }
                        }
                    }
                }
            }
            return maxValue; // 返回最大值,作为数独板的大小
        }

        // 从CSV文件读取数独板的初始值
        static void ReadFromCsv(int[,] board, string filePath)
        {
            using (var reader = new StreamReader(filePath))
            {
                int row = 0;
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine(); // 读取一行
                    var values = line.Split(','); // 按逗号分割该行

                    // 遍历该行中的每个值
                    for (int col = 0; col < values.Length; col++)
                    {
                        if (values[col] != "") // 如果值不为空
                        {
                            board[row, col] = int.Parse(values[col]); // 将值赋给数独板
                        }
                    }
                    row++; // 行索引递增
                }
            }
        }

        // 递归函数:尝试解决数独
        static bool SolveSudoku(int[,] board, int size)
        {
            // 遍历每一行和每一列
            for (int row = 0; row < size; row++)
            {
                for (int col = 0; col < size; col++)
                {
                    // 如果当前位置是0,表示需要填充
                    if (board[row, col] == 0)
                    {
                        // 尝试填入1到size的数字
                        for (int num = 1; num <= size; num++)
                        {
                            // 检查填入的数字是否有效
                            if (IsValid(board, row, col, num, size))
                            {
                                // 填入数字
                                board[row, col] = num;

                                // 递归调用解决剩余部分
                                if (SolveSudoku(board, size))
                                {
                                    return true; // 如果成功,返回true
                                }
                                else
                                {
                                    // 如果失败,重置当前位置为0
                                    board[row, col] = 0;
                                }
                            }
                        }
                        // 如果1到size的数字都不能填入,返回false
                        return false;
                    }
                }
            }
            // 如果没有空位置,说明解决成功
            return true;
        }

        // 检查在给定位置填入数字是否有效
        static bool IsValid(int[,] board, int row, int col, int num, int size)
        {
            // 检查同一行是否有相同的数字
            for (int i = 0; i < size; i++)
            {
                if (board[row, i] == num)
                {
                    return false; // 如果有相同的数字,则无效
                }
            }

            // 检查同一列是否有相同的数字
            for (int i = 0; i < size; i++)
            {
                if (board[i, col] == num)
                {
                    return false; // 如果有相同的数字,则无效
                }
            }

            // 检查子宫格中是否有相同的数字
            int boxSize = (int)Math.Sqrt(size); // 子宫格的大小
            int startRow = row - row % boxSize; // 子宫格的起始行
            int startCol = col - col % boxSize; // 子宫格的起始列
            for (int i = 0; i < boxSize; i++)
            {
                for (int j = 0; j < boxSize; j++)
                {
                    if (board[i + startRow, j + startCol] == num)
                    {
                        return false; // 如果有相同的数字,则无效
                    }
                }
            }

            // 如果没有相同的数字,则有效
            return true;
        }

        // 打印数独板
        static void PrintBoard(int[,] board, int size)
        {
            for (int row = 0; row < size; row++)
            {
                for (int col = 0; col < size; col++)
                {
                    Console.Write(board[row, col] + " "); // 打印数字
                }
                Console.WriteLine(); // 打印换行符
            }
        }
    }
}
View Code

 

 

标签:int,程序,解密,数独板,board,row,col,数独,size
From: https://www.cnblogs.com/lizhiqiang0204/p/18331603

相关文章

  • Winform程序控制网络继电器(康耐德,泥人..)运用Socket,TCP协议
    //继电器官网查看命令https://www.konnad.com/service/download/product-model/sdd4040-ad3staticbyte[]DOON=newbyte[]{0x00,0x01,0x00,0x00,0x00,0x06,0xFF,0x05,0x00,0x64,0xFF,0x00};//控制继电器打开(DO-1灯亮)staticbyte[]DOOFF=new......
  • 回归预测|基于灰狼优化BP神经网络的多特征输入单输出的数据回归预测Matlab程序GWO-BP
    文章目录一.灰狼优化BP神经网络基本原理二.灰狼优化BP神经网络Matlab程序2.1实验结果2.2Matlab程序一.灰狼优化BP神经网络基本原理灰狼优化(GreyWolfOptimization,GWO)结合BP神经网络进行数据回归预测是一种结合了优化算法和神经网络的方法,适用于多......
  • 如何在闪亮的应用程序中从geodataframe下载geopackage文件?
    我有一个shiny应用程序,它使用folium在地图上显示多个图层。我想让用户能够将其中一个图层(线串地理数据框)下载为地理包文件。这是我到目前为止的代码:#relevantimportedpackagesfromshinyimportApp,render,ui,reactiveimportpandasaspdimport......
  • 我正在制作一个可以打开wav文件的python程序,我想知道wav文件的格式是什么
    因此,我已经通过此网站的研究编写了验证并读取wav标头的代码。但我想知道,data段中的数据是如何存储的?它们位于16位部分中,彼此相邻放置。我认为在Audacity中制作440hz正弦波,然后导出它,会显示一些结果,并且字节确实看起来更整齐,但仍然像废话一样接缝。相信我,我已经......
  • C语言学习笔记 Day6(程序运行结构)
    Day6 内容梳理:1、Chapter4 程序运行结构:4.0概述,4.1条件判断语句(if/switch),4.2循环语句(while/for)Chapter4 程序运行结构4.0概述基本的3种程序运行结构:    ①顺序结构:程序按顺序执行,不发生跳转    ②选择结构:按是否满足条件,执行相对应的......
  • 程序化创建Mesh
    3D模型一般是由网格(Mesh)和纹理(Texture)两部分构成。那什么是网格?从概念上讲,网格是图形硬件用来绘制复杂内容的结构。它至少包含一组基于三维空间点的顶点,以及一组连接这些点的三角形(最基本的2D形状)。而网格是由这些三角形(直角等腰三角形)构成的表面。那什么又是纹理?纹理是应用......
  • Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?
    Emacs是一种强大的文本编辑器,有许多优点,使其在某些方面比传统的集成开发环境(IDE)更方便。以下是一些使用Emacs的优点:1.高度可定制性Emacs可以通过EmacsLisp编程语言进行高度自定义。你可以根据自己的需要修改和扩展Emacs的功能,几乎没有限制。2.统一的工作环境Ema......
  • 大模型时代需要怎样的“新程序员”
    你是AI大模型时代需要的“新程序员”吗?《爱丽丝梦游仙境》里红桃皇后说过一句话:你只有努力奔跑,才能一直留在原地。不被时代抛弃的方法只有一个,就是永远的奔跑和折腾。AI大模型时代,必然会重塑程序员这个岗位。要想做“新”程序员,这里有几点建议。第1,了解主流的大模型,以及......
  • 编写java程序,自动监控程度,dump内存文件
    步骤1:编写Java程序首先,编写一个Java程序,当内存使用达到11GB时生成heapdump文件,并以日期命名。将以下代码保存为MemoryMonitor.java文件:importcom.sun.management.HotSpotDiagnosticMXBean;importjavax.management.MBeanServer;importjava.lang.managemen......
  • 11.1 用Python开发一个计算器程序
    用Python开发一个计算器程序11.1用Python开发一个计算器程序11.1.1设计思路11.1.2编写代码11.1.3运行与测试11.1用Python开发一个计算器程序在编程的世界里,创建简单的工具如计算器是初学者学习编程语言的一个好方法。Python,由于其简洁的语法......