游戏开发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();
        }
    }
}
 

相关内容

热门资讯

红利浪潮动能澎湃:深市800余... 随着2024年年报披露进入高峰期,深市公司在陆续公布2024年度经营“成绩单”的同时,也给出了真金白...
海 利 得:关于公司新一代光伏... 每经AI快讯,有投资者在投资者互动平台提问:董秘您好,贵公司说光伏膜产品已完成第三代技术迭代,同比第...
中央气象台4月21日10时继续... 转自:中央气象台中央气象台4月21日10时继续发布强对流天气蓝色预警:预计4月21日14时至22日1...
市场监管总局修订《采用国际标准... 格隆汇4月21日|据市场监管总局,日前,市场监管总局修订出台《采用国际标准管理办法》,将于2025年...
广西出现今年首场超警洪水! 记者从广西壮族自治区水文中心获悉,4月20日8时至21日8时,据水文监测,贺州、河池、梧州、百色及桂...
今天起,报名→ 转自:微言教育此次面试在31个省(自治区、直辖市)举办,各省(自治区、直辖市)的报名公告将陆续上网,...
乐普医疗(300003.SZ)... 2025年4月19日,乐普医疗(300003.SZ)发布2024年年报。公司营业总收入为61.03亿...
儿童怎样运动最能“蹿个子” 春暖花开,万物生长。都说春天是孩子最能长高的季节,真的是这样吗?怎样运动才最能“蹿个子”?近日,记者...
中央气象台4月21日10时继续... 转自:中央气象台中央气象台4月21日10时继续发布暴雨蓝色预警:预计,4月21日14时至22日14时...
甘肃省临泽县新华镇市场监管所开... 中国质量新闻网讯 “五一”劳动节将至。连日来,甘肃省临泽县新华镇市场监督管理所结合辖区监管实际,开展...
三晖电气涨2.06%,成交额2... 4月21日,三晖电气盘中上涨2.06%,截至11:07,报14.35元/股,成交2792.49万元,...
北京电子城高科发行10.8亿元... 观点网讯:4月21日,北京电子城高科技集团股份有限公司公告了2025年度第一期中期票据(品种一)和(...
前2月我国原油进口量下降5%   中化新网讯 日前,中国五矿化工进出口商会发布1—2月我国原油进口情况显示,1—2月,我国原油进口...
擦不掉,根本擦不掉!女子家门口... “被家门口的树暗算了。一大早,想骑个共享单车出门,坐凳上、车把手上都是黏糊糊的点点。餐巾纸根本擦不掉...
三连冠!泰安市体校男篮勇夺省篮... 转自:泰安发布近日,从2025年山东省篮球锦标赛暨山东省第二十六届运动会篮球积分赛(男子甲组)赛场传...
华翔股份跌2.00%,成交额4... 4月21日,华翔股份盘中下跌2.00%,截至11:06,报15.18元/股,成交4937.01万元,...
国产电影票房前十中四部为京产 来源:北京日报 北京日报讯(记者王金跃)在第15届北京国际电影节中国电影高质量发展论坛上,北京电影家...
皖新传媒涨2.13%,成交额5... 4月21日,皖新传媒盘中上涨2.13%,截至11:12,报6.70元/股,成交5744.65万元,换...
热搜!京东宣布:招聘10万名全... 炸锅了。4月21日,京东发布《致全体外卖骑手兄弟们的公开信》,针对部分平台强迫外卖骑手“二选一”、不...
安诺其涨2.14%,成交额1.... 4月21日,安诺其盘中上涨2.14%,截至10:56,报5.25元/股,成交1.10亿元,换手率2....