游戏开发27课 速独算法

news/2024/4/27 12:34:09/文章来源:https://blog.csdn.net/s178435865/article/details/128097675

一、生成规则

  1、按顺序将1~9填入宫格中;

  2、检查所在行、列及小九宫格是否存在相同数字

  3、若存在相同数字则将数字加1 ,重复第2步

  这样就得到了初始的数独终盘

二、打乱顺序

  1、随机交换某两行(只能是同一个九宫格内的两行)

  2、随机交换某两列(只能是同一个九宫格内的两列)

       得到终盘

       

三、去掉部分数字,这样就得到了最终的数独了(可根据难度去掉不同数量的数字)

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

public class Sudu
{
    const int SIZE = 9;
    const int CELL_SIZE = 3;
    const int LEVEL_MAX = 10;
    static int[,] suduAry = new int[SIZE,SIZE];

    /**
10      * 生成数独
11      * @param level 难度级别 1~10
12      * @return
13      */
    public static int[,] generate(int level)
    {
        Random random = new Random();
        int n = random.Next(9) + 1;
        for (int i = 0; i < SIZE; i++)
        {
            for (int j = 0; j < SIZE; j++)
            {
                int p = (int)Math.Floor(i * 1.0f / CELL_SIZE);
                int q = (int)Math.Floor(j *1.0f/CELL_SIZE);
                for (int k = 0; k < SIZE; k++)
                {
                    if (checkColumn(n, j) && checkRow(n, i) && checkNineCells(n, p, q))
                    {
                        suduAry[i,j] = n;
                        break;
                    }
                    else
                    {
                        n = n % SIZE + 1;
                    }
                }
            }
            n = n % SIZE + 1;
        }
        //upset();
        //maskCells(level);

        return suduAry;
    }

    private static void maskCells(int level)
    {
        int min, max;
        level %= LEVEL_MAX;
        if (level == 0) level = LEVEL_MAX;

        if (level < 4)
        {
            min = 20;
            max = 15;
        }
        else if (level < 7)
        {
            min = 40;
            max = 10;
        }
        else if (level < 10)
        {
            min = 50;
            max = 10;
        }
        else
        {
            min = 60;
            max = 5;
        }

        Random random = new Random();
        int count = random.Next(max) + min;
        for (int i = 0; i < count; i++)
        {
            do
            {
                int n = random.Next(SIZE);
                int m = random.Next(SIZE);
                if (suduAry[n,m] > 0)
                {
                    suduAry[n,m] = 0;
                    break;
                }
            } while (true);
        }
    }

    /**
72      * 随机打乱顺序
73      */
    private static void upset()
    {
        Random random = new Random();
        //按行交换
        for (int i = 0; i < SIZE; i++)
        {
            int n = random.Next(CELL_SIZE);
            int p = random.Next(CELL_SIZE) * CELL_SIZE + n;
            for (int j = 0; j < SIZE; j++)
            {
                int tmp = suduAry[i,j];
                suduAry[i,j] = suduAry[p,j];
                suduAry[p,j] = tmp;
            }
        }
        //按列交换
        for (int i = 0; i < SIZE; i++)
        {
            int n = random.Next(CELL_SIZE);
            int p = random.Next(CELL_SIZE) * CELL_SIZE + n;
            for (int j = 0; j < SIZE; j++)
            {
                int tmp = suduAry[j,i];
                suduAry[j,i] = suduAry[j,p];
                suduAry[j,p] = tmp;
            }
        }
    }

    /**
99      * 检查某行
100      * @param n
101      * @param row
102      * @return
103      */
    private static bool checkRow(int n, int row)
    {
        bool result = true;

        for (int i = 0; i < SIZE; i++)
        {
            if (suduAry[row,i] == n)
            {
                result = false;
                break;
            }
        }

        return result;
    }
    /**
117      * 检查某列
118      * @param n
119      * @param col
120      * @return
121      */
    private static bool checkColumn(int n, int col)
    {
        bool result = true;
        for (int i = 0; i < SIZE; i++)
        {
            if (suduAry[i,col] == n)
            {
                result = false;
                break;
            }
        }
        return result;
    }

    /**
134      * 检查小九宫格
135      * @param n
136      * @param x
137      * @param y
138      * @return
139      */
    private static bool checkNineCells(int n, int x, int y)
    {
        bool result = true;
        int sx = x * 3, sy = y * 3;

        for (int i = sx; i < sx + 3; i++)
        {
            for (int j = sy; j < sy + 3; j++)
            {
                if (suduAry[i,j] == n)
                {
                    result = false;
                    break;
                }
            }
            if (!result) break;
        }

        return result;
    }

    public static void Main()
    {
        var arr = generate(1);
        for (int i = 0; i < SIZE;++i)
        {
            for(int j=0;j<SIZE;++j)
            {
                Console.Write(arr[i,j]+" ");
            }
            Console.WriteLine();
        }
    }
}
 

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

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

相关文章

GIT技巧

目录 基础命令 commit 、branch merge rebase 高级特性 自由修改提交树 cherry-pick rebase 远程仓库命令 基础命令 commit 、branch Git Commit Git 仓库中的提交记录保存的是你的目录下所有文件的快照&#xff0c;就像是把整个目录复制&#xff0c;然后再粘贴一样…

流媒体传输 - HLS 协议

HLS 全称是 HTTP Live Streaming&#xff0c;是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议&#xff0c;用于实时音视频流的传输。目前 HLS 协议被广泛的应用于视频点播和直播领域。 概述 原理介绍 通过将整条流切割成一个小的可以通过 HTTP 下载的媒体文件&#xff…

Spirng 痛苦源码学习(二)——手写spring大致总框架(一)

文章目录前言一、总体步骤如下1、spring 文件夹2、myProject 文件夹二、主要coding1、配置文件2、容器3、一些spring中的重要的注解4、项目中的使用5.重要的bean定义信息6、postProcessor重要&#xff0c;前置通知和后置主要项目的截图前言 本文主要基于spring的注解的方式完成…

Python的10个编程技巧,你不一定都知道

文末有Python资料下载 1. 原地交换两个数字 Python 提供了一个直观的在一行代码中赋值与交换&#xff08;变量值&#xff09;的方法&#xff0c;请参见下面的示例&#xff1a; 赋值的右侧形成了一个新的元组&#xff0c;左侧立即解析&#xff08;unpack&#xff09;那个&…

leetcode-每日一题-1758-生成交替二进制字符串的最少操作数(简单,数学思想)

这道题标记为简单题是正常的&#xff0c;因为当你想到0或者1开头的时候就已经结束了看看我的分析 那么知道这个信息之后就很简单了&#xff0c;加上我们的位运算符号^作为标记即可&#xff0c;大家看看代码实现 1758. 生成交替二进制字符串的最少操作数 难度简单88收藏分享切换…

Mysql基础知识篇(二)

1.UNION 与 UNION ALL 的区别&#xff1f; 如果使用 UNION&#xff0c;会在表链接后筛选掉重复的记录行如果使用 UNION ALL&#xff0c;不会合并重复的记录行从效率上说&#xff0c;UNION ALL 要比 UNION 快很多&#xff0c;如果合并没有刻意要删除重复行&#xff0c;那么就使…

Java基于springboot+vue的摄影作品展示交流系统 计算机毕业设计

随着时代的发展&#xff0c;人们的精神世界也在不断的丰富&#xff0c;尤其是在当下电子设备发展迅速的背景下&#xff0c;人们通过数码相机或者手机随后就可以拍下每一个美丽的瞬间&#xff0c;但是人们更希望将这些摄影作品传到网上和更多的人进行分享&#xff0c;同时也希望…

电脑键盘功能基础知识,快速入门,抓住这份详细教程

在互联网生活发达的今天&#xff0c;电脑已经成为了学习工作的必备工具。而用来操作电脑的关键&#xff0c;就是我们经常使用的键盘和鼠标。最近有不少的小伙伴来私信小编&#xff0c;希望小编做一个电脑键盘功能基础知识介绍的详细教程。这不&#xff0c;小编应大家要求&#…

用匠心创造可期未来!与广州流辰信息科技一起携手创佳绩!

当今社会世界经济一体化趋势逐渐明朗化&#xff0c;竞争也愈发激烈&#xff0c;同时&#xff0c;这也是一个机遇与挑战并存的开放社会。在机遇面前&#xff0c;作为企业&#xff0c;要紧紧抓住机遇&#xff0c;顺势而为&#xff0c;创造辉煌佳绩&#xff1b;在挑战面前&#xf…

嵌入式 C语言/C++ 常见笔试、面试题 难疑点汇总(经典100道)

#pragma comment。将一个注释记录放置到对象文件或可执行文件中。 #pragma pack。用来改变编译器的字节对齐方式。 #pragma code_seg。它能够设置程序中的函数在obj文件中所在的代码段。如果未指定参数&#xff0c;函数将放置在默认代码段.text中 #pragma once。保证所在文件只…

MySQL软件常见操作

1登录MySQL 登录&#xff0c;如果你配置了环境变量就可以winr&#xff0c;在运行框输入cmd&#xff0c;输入登录命令 第一种&#xff1a;直接输入密码 mysql -uroot -p(你的密码没有有括号) 第二种不直接输入密码 mysql -uroot -p 前面两种都是localhost登录 下面是完整版 m…

slam定位学习笔记(七)-g2o学习

主要学习的是这篇文章&#xff0c;但大佬并没有在文章里面仔细的讲g2o&#xff0c;所以我在网上找了这几篇介绍g2o的文章&#xff0c;讲的十分详细&#xff0c;对入门十分友好&#xff1a;文章一、文章二、文章三&#xff0c;这三篇都是一个作者写的&#xff0c;主要是针对编程…

MATLAB数据导入

MATLAB数据导入 在编写一个程序时&#xff0c;经常需要从外部读入数据。MATLAB使用多种格式打开数据。本章将要介绍MATLAB中数据的导入。 MATLAB中导入数据的方式有两种&#xff0c;分别是在命令行通过代码把数据导进去和通过MATLAB的数据导入向导导入数据。本节将为大家介绍第…

广播实现强制下线功能

实现强制下线功能 强制下线应该是一个比较常用的功能,比如QQ在比的地方被登陆了,就会强制比被挤下线.强制下线的功能还是比较简单的,只需要在界面上弹出一个框,告知用户无法再进行任何操作即可.只能点击确定然后跳转至登录界面.强制下线功能需要关闭所有的Activity,然后返回到…

微服务框架 SpringCloud微服务架构 4 Ribbon 4.3 饥饿加载

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构4 Ribbon4.3 饥饿加载4.3.1 饥饿加载4.3.2 总结4 Ribbon 4.3 饥饿加载 4…

【毕业设计】深度学习车辆颜色识别检测系统 - python opencv YOLOv5

文章目录1 前言2 实现效果3 CNN卷积神经网络4 Yolov55 数据集处理及模型训练6 最后1 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c;各个学校对毕设…

ATJ2157ATJ2127音乐按文件名拼音排序---标案是按内码进行排序

音乐按文件名拼音进行排序参考网站ATJ2157&ATJ2127 排序是按照内码(汉字为GBK即GBK936)排序的按拼音排序unicode与拼音的对比表(U2P.DAT)&#xff0c;需要打包到固件中U2P.DAT数据结构U2P.DAT生成代码是使用DEV-C生成其他说明U2P.DAT与ATJ2127平台代码参考网站 各种字符对…

activiti-api

activiti-api目录概述需求&#xff1a;设计思路实现思路分析1.VariableEvent2.EmptyResult3.BPMNElement4.BPMNError5.ConnectorAbstractSecurityManager参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&…

Mac下安装Hadoop

1、引言 如果想在Mac下安装Hadoop而且让Hadoop能正常运行&#xff0c;那安装之前需要先安装java&#xff0c;在Mac环境下安装Hadoop。 2、配置ssh环境 在Mac下如果想使用Hadoop&#xff0c;必须要配置ssh环境&#xff0c; 如果不执行这一步&#xff0c;后面启动hadoop时会出现…

PyCharm+PyQT5之三界面与逻辑的分离

之二的例程已经实现了界面与逻辑的分离,所建立的 Dialog Mainwindow 或者 widgets 等,界面改变其主调程序(暂且这样叫)更改,或者不需要大规模更改, 主调函数的程序是这样的 import sys import FistUI from PyQt5.QtWidgets import QApplication, QMainWindow,QDialog if __nam…