游戏开发27课 速独算法
创始人
2024-02-29 21:35:40
0

一、生成规则

  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             {
                Console.Write(arr[i,j]+" ");
            }
            Console.WriteLine();
        }
    }
}
 

相关内容

热门资讯

清朝有很多有名的历史人物,能给... 清朝有很多有名的历史人物,能给大家说几个清朝的历史人物吗?林则徐,张之洞,乾隆皇帝,曾国藩,朱耷,这...
曹丕的“太子四友”指的是谁 曹丕的“太子四友”指的是谁首先说,曹丕这四个,陈群司马懿是顶级的谋士和政治家,吴质有些小聪明,朱铄不...
在这次遇难者中存在了几名幸存者... 在这次遇难者中存在了几名幸存者。这句话是不是逻辑错误这句话的逻辑没有问题,有问题的是用词不当。遇难者...
在中国古代,有许多充满哲学智慧... 在中国古代,有许多充满哲学智慧的成语典故、寓言故事,如...在中国古代,有许多充满哲学智慧的成语典故...
清澈的意思是什么,… 清澈的意思是什么,…清净而明澈清而透明【造句】看着他清澈而又天真的眼眸,我的心久久不能平静……
蚂蚁森林合种爱情树一方退出怎么... 蚂蚁森林合种爱情树一方退出怎么找回来两个人合种的爱情树,我退出来,我怎么再次加入进去继续合作那个树?...
有好看的古代修炼小说推荐吗? 有好看的古代修炼小说推荐吗?古代重生穿越修炼......让我帮你找一下这些古代修炼的小说,找到这些类...
女主重生爱上前世辜负的人 女主重生爱上前世辜负的人重生我是你正妻渣女重生之竹马重生之弃渣重生之夫君可欺重生之换我疼你重生妇归来...
华胥引有广播剧吗 华胥引有广播剧吗现有的华胥引的广播剧是忆语广播剧社出品的,只有十三月和杯(这个是错字,请无视,居然输...
选文韩麦尔先生在说了,我的朋友... 选文韩麦尔先生在说了,我的朋友们我就要离开你们呢了,再见了银头鲑鱼tj75rt6yturdrruv ...
中通快递从北京保定市到广东揭阳... 中通快递从北京保定市到广东揭阳普宁要多久?中通快递从北京保定市到广东揭阳普宁要多久?从北京到广东需要...
关于离婚悲伤的歌曲 关于离婚悲伤的歌曲关于离婚悲伤的歌曲林俊杰《可惜没如果》 张靓颖《我走以后》 金志文《流着泪说分手》...
形容文笔差怎么说啊? 形容文笔差怎么说啊?哥哥姐姐,麻烦问下,我是做文员的,形容文案方面的工作很差应该怎么说啊?粗鄙怎么样...
我想做未婚妈妈,可行吗? 我想做未婚妈妈,可行吗?没关系吧?我同学好多他们妈妈都是30岁以后省得他们,都没事啊,但是如果你自己...
如何在两个excel表格里筛选... 如何在两个excel表格里筛选出重复的名字如何在两个excel表格里筛选出重复的名字1、电脑打开EX...
且试天下 哪些小说是用白绫做武... 且试天下 哪些小说是用白绫做武器的?神雕侠侣吖- -..小龙女一开始就是用白绫的聊斋 辛十四娘嘿嘿~...
自带高冷体质,笑起来温暖又治愈... 自带高冷体质,笑起来温暖又治愈的星座,你了解吗?虽然天生高冷体质,但是笑起来特别的温暖治愈的新作用天...
火星未解之谜 火星未解之谜多列举一些,每个事例最好长一点,谢啦~“火星人脸”, “地表被水冲击河道”,“原始大气和...
我是1991年10月4号生的,... 我是1991年10月4号生的,是什么星座啊有的说是处女座有的说是天平座,糊涂了,到底是什么啊很负责任...
梦见白狐狸,然后当时我骑着自行... 梦见白狐狸,然后当时我骑着自行车,我想躲开它,他很凶的的追赶我,最后它向我扑了过来,然后我就醒乐.你...