引用 | 编辑
高应大一年级
2008-12-30 15:04 |
楼主
▼ |
||
x0
请问 如何让去计算每个阵列的数字不要有重复出现 因为我不太能表白这个题目!!希望大家看的懂 数独 横列的数字都不能重复 以下示范列 #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, .. 访客只能看到部份内容,免费 加入会员 x0
|
引用 | 编辑
rei
2008-12-30 15:48 |
1楼
▲ ▼ |
印像中他的限制不单单只有横列吧???
应该是 『直列、横列、九宫格内』数字不重覆...且答案只有一个正解 个人建议可以朝『递回』的方式去研究= =+ x0 |
引用 | 编辑
三仙
2008-12-31 13:18 |
3楼
▲ ▼ |
下面是引用高应大一年级于2008-12-30 23:54发表的 : 建议你把 第三届 程式设计赛之系列挑战赛 作品发表 里有关的作品 拿出来参考修改成 9*9 的数独 x0 |
引用 | 编辑
高应大一年级
2008-12-31 13:28 |
4楼
▲ ▼ |
下面是引用三仙于2008-12-31 13:18发表的 : .......... 可是 我是要以主题的范列去写 也!!,不可以用其他的 是否可帮帮忙?? x0 |
引用 | 编辑
高应大一年级
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"); } x0 |
引用 | 编辑
高应大一年级
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"); } x0 |
引用 | 编辑
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 = ? } } 有点忘了 x0 |
引用 | 编辑
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; } x0 |
引用 | 编辑
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发表的 : x0 |
引用 | 编辑
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 x0 |