close
本題題目:
數獨是一種源自18世紀末的瑞士數學家歐拉(Leonhard Euler)所創造的拉丁方塊游戲。

在9格寬×9格高的大九宮格中有9個3格寬×3格高的小九宮格,已經有一些數字在裡面了(但並非一定採用數字,例如採用字母a,b,c...),根據這些數字,運用你的邏輯和推理,在其他的空格上填入1到9的數字,但是要注意了,每個數字在每個小九宮格內不能重複,每個數字在每行、每列也不能出現一樣的數字。 這種遊戲只需要邏輯思維能力,與數字運算無關。雖然玩法簡單,但數字排列方式卻千變萬化,所以不少教育者認為數獨是鍛鍊腦筋的好方法。 (wikipedia)

現在我們可以用程式來判斷一個九宮格數字是不是一個數獨的正解。

解題重點:

(1)輸入值如何整理,是整個題目的重點,輸入值處理的好,檢查就簡單。

輸入值我是放在一個陣列,存取所有資料,也方便控制,我是sudoku[行][列]讓指標變座標,方便檢查。

(2)數獨規則

1.一行一列一個數字只能出現一次。

2.九宮格內一個數字只能出現一次。

(3)檢查時要把規則寫好。

我分別寫了

1.check1()是檢查橫的是否有有照規則

2.check2()是檢查直的是否有依照規則

3.check3(0是檢查九宮格是否有依照規則

我check1()是先設定一個陣列負責檢查是否每個項都出現過,我利用一個陣列負責記錄。

以下為為範例程式碼:

int check1()

{

int k,g,h;

int correct=0;   

for(k=0;k<=8;k++)

{

int check[9]={1,2,3,4,5,6,7,8,9};//這個陣列負責紀錄

for(g=0;g<=8;g++)

{

if(check[sudoku[k][g]-1]==sudoku[k][g])

//負責紀錄此項有無用過 

{

    check[sudoku[k][g]-1] = -1;

}

}   

h=0;

//檢查每一項是否有給變至-1

while(h<=8)

{

if(check[h]!=-1)

{

correct = 0;

return correct;   

}

h+=1;

    }

if(h==9)   

correct = 1;       

}

return correct;

}


回傳值如果是1就是真,回傳0就是假

借此判斷在此個規則裡,有無正確,可省下不少時間

以下為解題步驟

(1)把輸入值放入

(2)檢查橫行,檢查直行,檢查九宮格

(3)依照回傳值去印出是否正確的數獨

(4)因為題目是可以多次輸入,所以要把最後的檢查變數初始化,不然程式只要有偵測一次不正確,之後就不會有正確的答案了。

以下為程式碼

https://docs.google.com/document/d/1lNMRQU46zEeNDr6_LbR-8yML3fpr6gNs5Vb0qCW0XfE/edit?usp=drivesdk  

arrow
arrow
    全站熱搜

    CoChinoCo 發表在 痞客邦 留言(0) 人氣()