引用 | 編輯
高應大一年級
2008-12-30 15:04 |
樓主
▼ |
||
![]() 因為我不太能表白這個題目!!希望大家看的懂 數獨 橫列的數字都不能重複 以下示範列 #include <iostream> #include <string> using namespace std;int main() { int a,b; int AA={ {0,0,0,0,0,0,0,6,0}, {4,0,6,7,8,0,0,0, .. 訪客只能看到部份內容,免費 加入會員 ![]()
|
引用 | 編輯
rei
2008-12-30 15:48 |
1樓
▲ ▼ |
印像中他的限制不單單只有橫列吧???
應該是 『直列、橫列、九宮格內』數字不重覆...且答案只有一個正解 個人建議可以朝『遞迴』的方式去研究= =+ ![]() |
引用 | 編輯
三仙
2008-12-31 13:18 |
3樓
▲ ▼ |
下面是引用高應大一年級於2008-12-30 23:54發表的 : 建議你把 第三屆 程式設計賽之系列挑戰賽 作品發表 裡有關的作品 拿出來參考修改成 9*9 的數獨 ![]() |
引用 | 編輯
高應大一年級
2008-12-31 13:28 |
4樓
▲ ▼ |
下面是引用三仙於2008-12-31 13:18發表的 : .......... 可是 我是要以主題的範列去寫 也!!,不可以用其他的 是否可幫幫忙?? ![]() |
引用 | 編輯
高應大一年級
2009-01-02 20:17 |
8樓
▲ ▼ |
[quote]下面是引用rei於2009-01-02 17:54發表的 :
![]() 不懂寫沒有關係... 連題目的正解及解法都不清楚... 想寫完這個程式...有一定的難度... 已經有版友提供大致方向了... 我們很期望你提出程式部份的哪裡不懂!!! PS老人家說教:以下刺眼= =+ 我只會寫 如何判斷 水平 垂直 的直..不能有重複而已!! 無法寫出 讓他自動去讀每一排的數字 ![]() #include <iostream> #include <string> using namespace std; int AA[9][9]={ {2,0,0,0,0,0,0,6,0}, {4,0,6,7,8,0,0,0,0}, {9,0,0,2,0,0,0,5,7}, {0,0,0,0,0,0,0,8,9}, {0,5,0,0,0,0,0,1,0}, {1,8,0,0,0,0,0,0,0}, {3,9,0,0,0,4,0,0,6}, {0,0,0,0,6,8,2,0,1}, {0,1,0,0,0,0,0,0,0}, }; int check_column(int y,int x) //在陣列(y,x)的位置,一整列中是唯一 ? { int a,count; count=0; for(a=0;a<9;a++) //a 從0~8 { if (AA[y][x]==AA[y][a]) count++; } if(count==1) return 1; //合法 else return 0; //不合法 } int check_raw(int y,int x) //在陣列(y,x)的位置,一整行中是唯一 ? { int a,count; count=0; for(a=0;a<9;a++) //a 從0~8 { if (AA[y][x]==AA[a][x]) count++; } if(count==1) return 1; //合法 else return 0; //不合法 } int check_available(int y, int x) { if(!check_raw(y,x)) return 0; //raw 失敗 if(!check_column(y,x)) return 0; //column 失敗 return 1; //成功 } void output() { int a,b; for(a=0;a<9;a++){ for(b=0;b<9;b++) cout<<AA[a]<<" "; cout<<endl; } } int main() { int temp,a,b; for(a=1;a<10;a++){ AA[0][0]=a; temp=check_available(0,0); } output(); system("pause"); } ![]() |
引用 | 編輯
高應大一年級
2009-01-03 23:27 |
10樓
▲ ▼ |
[quote]下面是引用rei於2009-01-02 21:27發表的 :
![]() 目前是沒有看到遞迴的部份... 給個小提示... 直的、橫的、九宮格....有著同一個特性 他們都是要檢查9次....(包括本身那格) [attachment=466850] 另外另一個提示... 不知是否有學過『除法』... ------------ 恩阿 但是我就是寫不出來怎去檢查其他數字 ![]() 以下 我有多寫 check_9X9 函式!!.....但是無用 ![]() 除法 有學過一點點!!!! #include <iostream> #include <string> using namespace std; int AA[9][9]={ {2,0,0,0,0,0,0,6,0}, {4,0,6,7,8,0,0,0,0}, {9,0,0,2,0,0,0,5,7}, {0,0,0,0,0,0,0,8,9}, {0,5,0,0,0,0,0,1,0}, {1,8,0,0,0,0,0,0,0}, {3,9,0,0,0,4,0,0,6}, {0,0,0,0,6,8,2,0,1}, {0,1,0,0,0,0,0,0,0}, }; int check_9x9(int y,int x) //在陣列(y,x)的位置 { int a,b,count,y_start,x_start; count=0; y_start=(y/9)*9; x_start=(x/9)*9; //找出9X9的位置 for(a=y_start;a<y_start+3;a++) //a 從0~8 for(b=x_start;b<x_start+3;b++) { if (AA[y][x]==AA[a]) count++; } if(count==1) return 1; //合法 else return 0; //不合法 } int check_column(int y,int x) //在陣列(y,x)的位置,一整列中是唯一 ? { int a,count; count=0; for(a=0;a<9;a++) //a 從0~8 { if (AA[y][x]==AA[y][a]) count++; } if(count==1) return 1; //合法 else return 0; //不合法 } int check_raw(int y,int x) //在陣列(y,x)的位置,一整行中是唯一 ? { int a,count; count=0; for(a=0;a<9;a++) //a 從0~8 { if (AA[y][x]==AA[a][x]) count++; } if(count==1) return 1; //合法 else return 0; //不合法 } int check_available(int y, int x) { if(!check_9x9(y,x)) return 0; //9x9失敗 if(!check_raw(y,x)) return 0; //raw 失敗 if(!check_column(y,x)) return 0; //column 失敗 return 1; //成功 } void output() { int a,b; for(a=0;a<9;a++){ for(b=0;b<9;b++) cout<<AA[a]<<" "; cout<<endl; } } int main() { int temp,a,b; for(a=1;a<10;a++){ AA[0][0]=a; temp=check_available(0,0); if(temp) cout<<"AA[0][0]="<<AA[0][0]<<"此數字OK"<<endl; } output(); system("pause"); } ![]() |
引用 | 編輯
overing
2009-01-04 23:01 |
12樓
▲ ▼ |
就算是作業~
問的這麼認真也已經贏過很多人了 (老師很當的嚴吧? ![]() 他一開始陣列是二維方式存放數字 直接當作直角座標系來思考 雙層巢狀迴圈做起來也許會比較快~ 複製程式 int w = sizeof(AA[0])/AA[0][0]); //取陣列長 int h = sizeof(AA/AA[0]); //取陣列寬 for(int x = 0; x < w; x++) { for(int y = 0; y < h; y++) { //九宮格 tip : x & y 與 3 的倍數(.....) //直橫 tip : x & y = ? } } 有點忘了 ![]() ![]() |
引用 | 編輯
teldeanmac85
2009-01-06 12:37 |
13樓
▲ ▼ |
其實做法有很多 這個讓你參考
請自行修改 因為最近沒有太多時間 看你問了那麼多天 作業也應該交出去了 剛剛中午休息匆忙的寫一下 你可以試試看 check_func 和 check_func2 都可以用 只是作法上不一樣而已 如果想寫程式就繼續堅持下去 加油~ 複製程式 #include <iostream> #include <algorithm> using namespace std; #define FAIL 1 #define PASS 0 #define SUM 1+2+3+4+5+6+7+8+9 int check_func(int *buf) { int i; sort(buf,buf+9); for(i=0;i<9;i++){ if(*(buf+(i)) - (i+1) != 0){ return FAIL; } } return PASS; } int check_func2(int *buf) { int i,buf_sum=0; for(i=0;i<9;i++){ buf_sum += buf[i]; } if(buf_sum - SUM != 0){return FAIL;} return PASS; } int main(int argc, char* argv[]) { int AA[9][9]={ {1,2,3,4,5,6,7,8,9}, {2,1,2,3,4,5,6,7,8}, {3,9,1,2,3,4,5,6,7}, {4,8,9,1,2,3,4,5,6}, {5,7,8,9,1,2,3,4,5}, {6,6,7,8,9,1,2,3,4}, {7,5,6,7,8,9,1,2,3}, {8,4,5,6,7,8,9,1,2}, {9,3,4,5,6,7,8,9,1}, }; int row_buf[9] = {0}; int col_buf[9] = {0}; int n_buf[9] = {0}; int x=0,y=0,sx=0,sy=0,i=0,j=0,n=0; for(x=0; x<9; x++){ for(y=0; y<9; y++){ row_buf[y] = AA[x][y] ; col_buf[y] = AA[y][x] ; } if(check_func(row_buf)){cout<<"FAIL"<<endl;exit(0);} if(check_func(col_buf)){cout<<"FAIL"<<endl;exit(0);} } for(i=0;i<9;i=i+3){ for(j=0;j<9;j=j+3){ n = 0; for(x=0;x<3;x++){ for(y=0;y<3;y++){ n_buf[n] = AA[x+i][y+j]; n++; } } if(check_func(n_buf)){cout<<"FAIL"<<endl;exit(0);} } } return 0; } ![]() |
引用 | 編輯
teldeanmac85
2009-01-06 20:07 |
16樓
▲ ▼ |
(我輸出怎DOS跑出來0.5秒..之後就不見了)
= =a~ 他不是不見 你要自己在return 0 或 exit(0)前加 上system("pause"); 或 getchar(); 這個很基本 要記起來 因為我是用vc 6.0寫的所以在debug mode執行 不會跳開 還有一點是我沒有印出陣列 這你應該看得出來 我只有判斷array內的是否是合法數獨而已 是的話 應該什麼都沒有 press any key ... 否的話 會印出FAIL字串 遞迴我是沒有用到 我只用for迴圈就做完了 下面是引用高應大一年級於2009-01-06 13:36發表的 : ![]() |
引用 | 編輯
rei
2009-01-06 23:43 |
17樓
▲ ▼ |
下面是引用高應大一年級於2009-01-06 13:52發表的 : 我講得那個部份...主要是要看『算出來的答案跟計算過程的關係』... 程式的部份並非重點... ![]() 我想你應該知道 『/』是除法 求出來的值則是為『商數』... 『%』也是一種除法 不過求出來的值則是『餘數』... 配合上該圖片 ![]() 這圖片,跟請你計算的部份~ 我們都知道,數讀他一共有81格!!! 其中會有某幾格會先給我們數值!!! 利用這個特性,將遞迴的部份來深入求取 如果剛好從AA[0][0]來開始看!!! 將0利用上兩個數學式來算 0/9 = 0 0%9 = 0 便可以知道0在座標AA[0][0]的位址....= =+ 在遞迴中加個for來放值~判斷是否合理!! 合理則往內切入一格~ 不合理則退回至前一格!!! 如果很順利的切入第81格了話~ 恭喜!!! 你已經求出答案了!!! 把他列印出來就完成了!!! 以上XD ![]() |