随机数独算法

来自负负

随机生成数独,答案,答题版

----------------
----随机数独生存,填空----
----------------
--获取某元素在表中的位置
local function isInside(value,tab)
    for a,v in ipairs(tab) do
        if v==value then
            return a
        end
    end
    return -1
end
---------------------------------------------------------------------------
---------------------------------------------------------------------------
local num={}
--填充是否有效
local function isRowLegal(i,v)
    local row,i1=math.floor(i/9),0
    for i1=0,8 do
        if (v==num[row*9+i1])and(i~=row*9+i1) then
            return false
        end
    end
    return true
end
local function isColLegal(i,v)
    local col,i1=i%9,0
    for i1=0,8 do
        if (v==num[i1*9+col])and(i~=i1*9+col) then
            return false
        end
    end
    return true
end
local function isSubLegal(i,v)
    local row=math.floor(i/9)
    local col=i%9
    local x1=math.floor(row/3)*3
    local y1=math.floor(col/3)*3
    local i1,i2=0,0
    for i1=0,2 do
        for i2=0,2 do
            if (v==num[(x1+i1)*9+y1+i2])and(i~=(x1+i1)*9+y1+i2) then
                return false
            end
        end
    end
    return true
end
local function isLegal(i,v)
    if (not(isRowLegal(i,v)))or(not(isColLegal(i,v)))or(not(isSubLegal(i,v))) then
        return false
    end
    return true
end
--递归填充数字
local function setN(i)
    if i==81 then
        return true
    elseif num[i]~=0 then
        return setN(i+1)
    else
        local randOrder,i1={},0
        for i1=0,9 do
            randOrder[i1]=i1
        end
        for i1=1,9 do
            local r=math.random(0,9)
            local t1=randOrder[r]
            randOrder[r]=randOrder[i1]
            randOrder[i1]=t1
        end
        for i1=1,9 do
            if isLegal(i,randOrder[i1]) then
                num[i]=randOrder[i1]
                if setN(i+1) then
                    return true
                end
            end
        end
    end
    num[i]=0
    return false
end
--获取随机数独
local function getNum()
    math.randomseed(os.time())
    local i1=0
    for i1=0,80 do
        num[i1]=0
    end
    setN(0)
    return num
end
---------------------------------------------------------------------------

--游戏设定:显示概率
local p,pel=0.3,100000
--------------------------------------------
local nums,cl={},{}--9×9
local uid=0
local j1,j2=0,0
local ed=0
--------------------------------------------


        for j1=0,80 do
            nums[j1]=num[j1]
        end
        cl={}
        for j1=0,80 do
            j2=math.random(1,pel)
            if j2<=p*pel then
                cl[j1]=nums[j1]
            else
                cl[j1]=0
                num[j1]=0---
            end
        end
getNum()
print(unpack(nums))
print(unpack(num))


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值