香港寵物小精靈村落 論壇

 找回密碼
 加入
查看: 2971|回復: 9
打印 上一主題 下一主題

[求助] C.I.T.的Dev-C++問題(sudoku.c)

[複製鏈接]
跳轉到指定樓層
1#
發表於 26/4/2008 01:34 AM | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這個program的效果是確認在9*9的方格中,在同一個橫排、直排和3*3的方格中的數值沒有相同﹕
#include <stdio.h>
int main(){
    int num[9][9], row, column, i, j, k, l, temp, check, min[3] = {0, 3, 6}, max[3] = {3, 6, 9};
    for (row = 0; row < 9; row++){
        for (column = 0; column < 9; column++){
            do{
                    check = 0;
                    printf("Input the number at (%d,%d):", row + 1, column + 1);
                    scanf("%d", &num[row][column]);
                    temp = num[row][column];
                    if (num[row][column] < 0 || num[row][column] > 9){
                                         printf("Input Error!\n");
                                         check = 1;}
                                         for (i = 0; i < column; i++)
                                         if (temp == num[row][ i]){
                                                  printf("Same number on the same column!\n");
                                                  check = 1;}
                                                  for (i = 0; i < row; i++)
                                                  if (temp == num[ i][column]){
                                                           printf("Same number on the same row!\n");
                                                           check = 1;}
                                                           if (row < 3)
                                                           i = 0;
                                                           else if (row < 6)
                                                           i = 1;
                                                           else
                                                           i = 2;
                                                           if (column < 3)
                                                           j = 0;
                                                           else if (column < 6)
                                                           j = 1;
                                                           else
                                                           j = 2;
                                                           for (k = min[ i]; k < max[ i]; k++)
                                                           for (l = min[j]; l < max[j]; l++)
                                                           if (k != row || l != column)
                                                           if (temp == num[k][l]){
                                                           printf("Same number in the same square!\n");
                                                           check = 1;}}
                                                               while(check);}}
                                                               if (!check)
                                                               printf("You win!\n");
                                                               for (row = 0; row < 9;row++){
                                                                   for (column = 0; column < 9; column++)
                                                                   printf("%4d", num[row][column]);
                                                                   printf("\n");}
                                                                   system("Pause");
                                                                   return 0;}
以此結果為例﹕
2 6 5 1 7 3 4 8 9
1 8 3 5 4 9 7 2 6
7 9 4 2 8 6 5 1 3
4 1 8 3 9 7 2 6 5
9 2 7 6 5 8 3 4 1
5 3 6 4 1 2 9 7 8
8 5 1 7 3 4 6 9 2
3 4 2 9 6 1 8 5 7
6 7 9 8 2 5 1 3 4
變數num[1][7]將以"Same number in the same square!"的理由被系統拒絕。
事後證明num[ i][j](i = 0-1, j = 3-8; i = 3-5, j = 3-5)也會因以上理由而不接納"2"的輸入。
(num[5][6]以後的變數難以證明)
認為用來確認3*3方格內數值的部分﹕
if (row < 3)
                                                           i = 0;
                                                           else if (row < 6)
                                                           i = 1;
                                                           else
                                                           i = 2;
                                                           if (column < 3)
                                                           j = 0;
                                                           else if (column < 6)
                                                           j = 1;
                                                           else
                                                           j = 2;
                                                           for (k = min[ i]; k < max[ i]; k++)
                                                           for (l = min[j]; l < max[j]; l++)
                                                           if (k != row || l != column)
                                                           if (temp == num[k][l]){
                                                           printf("Same number in the same square!\n");
                                                           check = 1;}

有誤,請問各位有關問題的錯誤原因和修正方法。

[ 本帖最後由 魔術師Chikorita 於 26/4/2008 10:52 PM 編輯 ]
2#
發表於 26/4/2008 08:47 PM | 只看該作者
回復

使用道具 舉報

3#
 樓主| 發表於 26/4/2008 10:34 PM | 只看該作者

Discuz!代碼問題,抱歉沒整理好
回復

使用道具 舉報

4#
發表於 27/4/2008 09:10 AM | 只看該作者
可能是min和max的array數值重疊的錯
試將max[3] = {4,7,10} ?
(我沒讀開C++...)

試轉作pascal代碼後
似乎是你的maximum value 3,6,9全部都應該改作4,7,10
因為你用的是 ?<3 代表 for loop 到2就完,
而不是到3

[ 本帖最後由 EnTaSIa 於 27/4/2008 11:59 AM 編輯 ]

評分

參與人數 1金幣 +5收起 理由
fish+ 5熱心解答他人問題

查看全部評分

回復

使用道具 舉報

5#
 樓主| 發表於 27/4/2008 12:24 PM | 只看該作者
的確是到2完
num[k][l] 的k和l會等於0, 1, 2/ 3, 4, 5/ 6, 7, 8三種數值

若將maximum value 都 +1的話
k和l將變成0, 1, 2, 3/ 3, 4, 5, 6/ 6, 7, 8, 9
這令檢查的範圍變成重疊的4*4
回復

使用道具 舉報

6#
發表於 4/5/2008 09:44 PM | 只看該作者
原帖由 EnTaSIa 於 27/4/2008 09:10 AM 發表
可能是min和max的array數值重疊的錯
試將max[3] = {4,7,10} ?
(我沒讀開C++...)

試轉作pascal代碼後
似乎是你的maximum value 3,6,9全部都應該改作4,7,10
因為你用的是 ?

你懂怎麼轉啊...
真強...

可否說一說你在check square時是用甚麼方法的...
例如說是不是逐行check還是用甚麼方法...
事實上本是Pascal的人很難看懂...
回復

使用道具 舉報

7#
發表於 4/5/2008 11:15 PM | 只看該作者
原帖由 RX78-2 於 4/5/2008 09:44 PM 發表

你懂怎麼轉啊...
真強...

可否說一說你在check square時是用甚麼方法的...
例如說是不是逐行check還是用甚麼方法...
事實上本是Pascal的人很難看懂...

感覺上看得出它的sequence._.
用pascal打過一次後好像沒出問題

[ 本帖最後由 EnTaSIa 於 4/5/2008 11:18 PM 編輯 ]
回復

使用道具 舉報

8#
發表於 4/5/2008 11:39 PM | 只看該作者
(唔知你解決左未, 不過照講啦~)

我剛剛試過, 連第一個input, 即係"2" 都有問題~
仲要一次過print兩次"Same number in the same square"...

再睇睇, 原來有一個錯誤~

致命錯誤: initialization
你冇initialize個2D array, 所以當你check square既時候會有偏差

當我改番之後就冇事了

ps. 其實還有一個minor mistake, 睇下你搵唔搵到~

[ 本帖最後由 pokevect 於 4/5/2008 11:42 PM 編輯 ]

評分

參與人數 1金幣 +5收起 理由
fish+ 5熱心解答他人問題

查看全部評分

回復

使用道具 舉報

9#
 樓主| 發表於 5/5/2008 01:00 AM | 只看該作者
嗯,只顧及了輸入數值本身而沒理會之後的
但不解為可只在特定數值出現問題(學校試的是"3"出error、手指試的是"1"出error)

那個minor mistake 是交換了"Same number in the same row!"和"......column!"的位置﹖

[ 本帖最後由 魔術師Chikorita 於 5/5/2008 01:04 AM 編輯 ]
回復

使用道具 舉報

10#
發表於 5/5/2008 08:07 AM | 只看該作者
原帖由 魔術師Chikorita 於 5/5/2008 01:00 AM 發表
嗯,只顧及了輸入數值本身而沒理會之後的
但不解為可只在特定數值出現問題(學校試的是"3"出error、手指試的是"1"出error)

那個minor mistake 是交換了"Same number in the same row!"和"......column!"的位置﹖


其實唔係特定數值架, 幸運的話其實可以由頭到尾都冇事,
相反, 可以1-9都有事, 原因係本身用黎儲存數值既memory slot,
如果之前被其他程式用過之後, 就會儲左一個數值,
當你再開另一個program, 咁岩又要用到其中既memory slot,
o係你未initialize既情況之下, 佢地就會密認memory slot本身既數值為正確,
然後用作運算, 錯誤亦由此發生。


我睇到既係呢句:
if (num[row][column] < 0 || num[row][column] > 9){...}

我相信要改做:
if (num[row][column] <1|| num[row][column] > 9){...}
如果唔係連0都可以輸入~

評分

參與人數 1金幣 +5收起 理由
fish+ 5熱心解答他人問題

查看全部評分

回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 加入

本版積分規則

手機版|Archiver|香港寵物小精靈村落

GMT+8, 25/11/2024 05:06 PM , Processed in 0.014903 second(s), 14 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表