数独生成算法

679 阅读2分钟

1.先生成一个种子列表 代码:swift

    var zhongziArray:Array<Int> = [];
    
    
    while zhongziArray.count<9{
        let number = arc4random()%9+1
        if zhongziArray.contains(Int(number)){
            continue
        }else{
            zhongziArray.append(Int(number))
        }
    }

2.行变换之后,替换左右两边

3.列变换之后替换上下两边

4.左右两边分别列变换替换四个角的3*3空格

代码:swift

//num 次数
func hangbianhuan(array:Array<Int>,_ num:Int)->Array<Int>{
    if(num==1){
        return  Array(array[3...5])+Array(array[6...8])+Array(array[0...2])
    }else{
        return  Array(array[6...8])+Array(array[0...2])+Array(array[3...5])
    }
}
hangbianhuan(array: [1,2,3,4,5,6,7,8,9],1)
hangbianhuan(array: [1,2,3,4,5,6,7,8,9],2)


//num 次数
func liebianhuan(array:Array<Int>,_ num:Int)->Array<Int>{
    var cArray = array
    if(num==1){
        for i in 0...8{
            
            switch i%3 {
            case 0:
                cArray[i]=array[i+1]
            case 1:
                cArray[i]=array[i+1]
            case 2:
                cArray[i]=array[i-2]

            default: break
                
            }
            
        }
        return  cArray
        
    }else{
        for i in 0...8{
                   
                   switch i%3 {
                   case 0:
                       cArray[i]=array[i+2]
                   case 1:
                       cArray[i]=array[i-1]
                   case 2:
                       cArray[i]=array[i-1]

                   default: break
                       
                   }
                   
               }
               return  cArray
    }
}

liebianhuan(array: [1,2,3,4,5,6,7,8,9],1)
liebianhuan(array: [1,2,3,4,5,6,7,8,9],2)



func addNineToSudu(_ array:Array<Int>,_ sudu:Array<Array<Int>>,_ index:Int)->Array<Array<Int>>{
    
    var nsudu = sudu
    let rl = 0 + index/3*3
    let rr = 2 + index/3*3
    let cl = 0 + index%3*3
    let cr = 2 + index%3*3
    print(rl)
    print(rr)
    print(cl)
    print(cl)

    for column in cl...cr{
        for row in rl...rr{
            let c=column-cl
            let r=row-rl
            nsudu[row][column]=array[c+r*3]
        }
    }
    return nsudu
}


addNineToSudu([1,2,3,4,5,6,7,8,9],[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]],4)
func printLine(_ array:Array<Any>){
    for i in array{
        print(i)
        print("\n")
    }
}

func shengchengshudu(){
    
    var zhongziArray:Array<Int> = [];
    
    
    while zhongziArray.count<9{
        let number = arc4random()%9+1
        if zhongziArray.contains(Int(number)){
            continue
        }else{
            zhongziArray.append(Int(number))
        }
    }
    
    var shuduArray = [[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]];
    //添加中心
    shuduArray = addNineToSudu(zhongziArray,shuduArray,4)
    printLine(shuduArray)
    //添加左边
    let lhang = hangbianhuan(array: zhongziArray,1)
    shuduArray = addNineToSudu(hangbianhuan(array: zhongziArray,1),shuduArray,3)

    //添加右边边
    let rhang = hangbianhuan(array: zhongziArray,2)

    shuduArray = addNineToSudu(hangbianhuan(array: zhongziArray,2),shuduArray,5)

    shuduArray = addNineToSudu(liebianhuan(array: zhongziArray,1),shuduArray,1)
    shuduArray = addNineToSudu(liebianhuan(array: zhongziArray,2),shuduArray,7)


    shuduArray = addNineToSudu(liebianhuan(array: lhang,1),shuduArray,0)
    shuduArray = addNineToSudu(liebianhuan(array: lhang,2),shuduArray,6)
    shuduArray = addNineToSudu(liebianhuan(array: rhang,1),shuduArray,2)
    shuduArray = addNineToSudu(liebianhuan(array: rhang,2),shuduArray,8)


    

}

shengchengshudu()