天天看點

判斷是否是數獨

題目

數獨是一類廣受大衆喜歡的填數遊戲。最典型的數獨由9*9的方格組成,其中會填入一些1~ 9的數字。玩家需要補上剩餘格子的數字,使得每個格子所在的行、列、小九宮格都包含有1~9的數字,不重不漏。

現在小明已經做好了一些填好了所有數字的數獨遊戲題面,正準備挖空。但在此之前,他希望你幫忙檢查一下題面是否正确,即做好的題面是否每個格子都滿足所在行、列、小九宮格都包含1~9。

題解

package main

import (
    "fmt"
)

func main() {
    //輸入
    var T int
    fmt.Scan(&T)

    if T < 1 || T > 5 {
        fmt.Println("T 超出範圍")
        return
    }

    flag := true
    var result [5] bool

    for i := 0; i < T; i++ {
        //輸入數組
        var c [9][9] int
        for i := 0; i < 9; i++ {
            for j := 0; j < 9 ; j++ {
                var num int
                fmt.Scan(&num)
                c[i][j] = num
            }
        }

        for n := 0; n < 9 ; n++ {
            //比較行
            if isRepetition(c[n]) {
                flag = false
                break
            }

            //比較列
            var col [9] int
            for k := 0; k < 9 ;k++ {
                col[k] = c[k][n]
            }
            if isRepetition(col){
                flag = false
                break
            }
        }

        if flag {
            //九宮格
            var nine [9] int
            for n := 0 ; n < 7; n++{
                for k := 0 ; k < 7; k++{
                    nine[0] = c[n][k]
                    nine[1] = c[n+1][k]
                    nine[2] = c[n][k+1]
                    nine[3] = c[n+2][k]
                    nine[4] = c[n][k+2]
                    nine[5] = c[n+2][k+1]
                    nine[6] = c[n+1][k+2]
                    nine[7] = c[n+1][k+1]
                    nine[8] = c[n+2][k+2]
                }
            }
            if isRepetition(nine) {
                result[i] = false
            }else {
                result[i] = true
            }
        }else {
            result[i] = false
        }
    }
    for i := 0; i < T ; i++{
        if result[i] {
            fmt.Println("YES")
        }else {
            fmt.Println("NO")
        }
    }
}


//判斷數組中9個數是否重複
func isRepetition(numChar [9] int) bool {
    for i := 0 ; i < len(numChar)-1; i++ {
        for j := i+1; j < len(numChar); j++ {
            if numChar[i] == numChar[j] {
                return true
            }
        }
    }
    return false
}      

繼續閱讀