創作內容

2 GP

高中生程式解題系統 - a016: 數獨(SUDOKU)

作者:PM2011│2015-01-20 14:59:34│巴幣:4│人氣:2195
之前寫過的程式,不過個人覺得寫得很爛.....
所以重新再度重寫了!
結合著新的想法跟現在的知識,新寫出來的程式比較整潔。
雖然程式又大了100KB......- -|||


正文
使用C語言實作。
AC (0ms, 368KB)


說明:
數獨的特性為每一行、列、小九宮內,有1~9之數字,且不重複。
使用乘法將其區塊內的數字相乘,即可得到9!(階乘)的數字。
因其數字限定在1~9間,故可使用階乘做為判定條件,只要有任一數字錯誤,判定區塊所得到的數值就不等於1*2*3*4*5*6*7*8*9


程式碼如下:
/*a016數獨(SUDOKU)*/
#include <stdio.h>
typedef enum
{
    HORIZONTAL, /* 水平 */
    VERTICAL, /* 垂直 */
    JIUGONGGE /* 九宮格 */
}QueryType;/* 查詢方式 */
/* 查詢函數 */
int Query(QueryType type, int SUDOKU[9][9], int i, int j);
/* 數獨判定 */
int Factorial(int SUDOKU[9][9], QueryType type);
int main()
{
    int data[9][9];
    while (scanf("%d", &data[0][0])!=EOF)
    {
        int i, j, answer = 1, factorial = 1;
        /* 資料輸入 */
        for(i = 0; i < 9; i++)
        {
            for(j = (i==0)? 1 : 0; j< 9; j++)
            {
                scanf("%d",&data[i][j]);
            }
        }
        
        /* 如不為0,則為數獨 */
        answer = Factorial(data, HORIZONTAL) /* 水平方向判定 */
                * Factorial(data, VERTICAL) /* 垂直方向判定 */
                * Factorial(data, JIUGONGGE); /* 小九宮判定 */
        printf("%s\n", (answer)? "yes" : "no");
    }
    return 0;
}
/* 查詢函數 */
int Query(QueryType type, int SUDOKU[9][9], int i, int j)
{
    switch(type)
    {
        case HORIZONTAL:
            return SUDOKU[i][j];
        case VERTICAL:
            return SUDOKU[j][i];
        case JIUGONGGE:
            return SUDOKU[(i / 3) * 3 + j/ 3][(i % 3) * 3 + j % 3];
    }
}
/* 數獨判定 */
int Factorial(int SUDOKU[9][9], QueryType type)
{
    const int FACTORIAL_9 = 1*2*3*4*5*6*7*8*9;
    int i, j, factorial = 1;
    for(i = 0; i < 9; i++, factorial = 1)
    {
        for(j = 0; j < 9; j++)
        {
            factorial *= Query(type,SUDOKU, i, j);
        }
        if(factorial != FACTORIAL_9)/* 不為9!(階乘)之數值 */
            return 0;
    }
    return 1;
}
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2720737
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:程式|解題系統|程式碼|C語言|C|陣列|迴圈|數獨|SUDOKU

留言共 1 篇留言

解剖青蛙的飛鼠
不好意思 有點疑問
1*2*6*2*5*6*7*8*9 也是9!
但是不合法?
雖然其它測試應該可以抓出來

02-11 01:45

PM2011
是的,這的確是一個BUG,不過因為當時沒有想到其他方法,我就先將就了~
不過後來新寫的版本就沒有用這種方式檢查了。02-11 11:35
我要留言提醒:您尚未登入,請先登入再留言

2喜歡★abc5593449 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:高中生程式解題系統 - ... 後一篇:RimWorld(邊緣世...

追蹤私訊切換新版閱覽

作品資料夾

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】