高應大一年級
|
分享:
▼
[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"); }
|
|
x0
[10 樓]
From:臺灣固網股份有限公司 | Posted:2009-01-03 23:27 |
|
|
teldeanmac85
|
分享:
▲
▼
其實做法有很多 這個讓你參考 請自行修改 因為最近沒有太多時間 看你問了那麼多天 作業也應該交出去了 剛剛中午休息匆忙的寫一下 你可以試試看 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;
}
此文章被評分,最近評分記錄財富:50 (by 三仙) | 理由: 因為您的參與,讓程式設計更容易!! | |
|
|
|
|
x0
[13 樓]
From:臺灣 | Posted:2009-01-06 12:37 |
|
|
rei
|
分享:
▲
▼
下面是引用高應大一年級於2009-01-06 13:52發表的 : for ( a=0;a<80;a++ ){ cout<<a<<"/9="<< a/9<<endl; cout<<a<<"%9="<<a%9<<endl; }
我只知道用FOR 迴圈去寫而已
但是之後 我就不懂了 我講得那個部份...主要是要看『算出來的答案跟計算過程的關係』... 程式的部份並非重點... 我想你應該知道 『/』是除法 求出來的值則是為『商數』... 『%』也是一種除法 不過求出來的值則是『餘數』... 配合上該圖片 這圖片,跟請你計算的部份~ 我們都知道,數讀他一共有81格!!! 其中會有某幾格會先給我們數值!!! 利用這個特性,將遞迴的部份來深入求取 如果剛好從AA[0][0]來開始看!!! 將0利用上兩個數學式來算 0/9 = 0 0%9 = 0 便可以知道0在座標AA[0][0]的位址....= =+ 在遞迴中加個for來放值~判斷是否合理!! 合理則往內切入一格~ 不合理則退回至前一格!!! 如果很順利的切入第81格了話~ 恭喜!!! 你已經求出答案了!!! 把他列印出來就完成了!!! 以上XD
|
人生要是跟等巴士一樣... 你願意搭哪一種車? 爆滿?髒車?舊車?新車?空車?還是...走路?
|
x0
[17 樓]
From:臺灣 | Posted:2009-01-06 23:43 |
|
|
|