在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
留言列表