数独 ......谢谢拉[已解决]

Home Home
引用 | 编辑 高应大一年级
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-30 23:54
2楼
  
下面是引用rei于2008-12-30 15:48发表的 : 到引言文
印像中他的限制不单单只有横列吧???

应该是

『直列、横列、九宫格内』数字不重覆...且答案只有一个正解

个人建议可以朝『递回』的方式去研究= =+





可以帮我写嘛!!??表情
真的真的写不出来表情

表情  

用递回的方式

拜托了

谢谢你

献花 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发表的 : 到引言文


建议你把 第三届 程式设计赛之系列挑战赛 作品发表 里有关的作品
拿出来参考修改成 9*9 的数独




..........


可是 我是要以主题的范列去写 也!!,不可以用其他的
是否可帮帮忙??

献花 x0
引用 | 编辑 leacks
2009-01-01 08:10
5楼
  
我再猜你该不会是作业都叫这边的人帮忙吧= =
高应大 表情

rei+1

不过此题目是不大好写
但google应该会有范例

献花 x0
引用 | 编辑 高应大一年级
2009-01-02 01:23
6楼
  
下面是引用leacks于2009-01-01 08:10发表的 : 到引言文
我再猜你该不会是作业都叫这边的人帮忙吧= =
高应大 表情

rei+1

不过此题目是不大好写
但google应该会有范例



这题的确是作业!! 因为我真的不会写,所以不知道该怎办...只好求救


希望可以帮帮忙 !!拜托了

献花 x0
引用 | 编辑 rei
2009-01-02 17:54
7楼
  
不懂写没有关系...
连题目的正解及解法都不清楚...
想写完这个程式...有一定的难度...

已经有版友提供大致方向了...
我们很期望你提出程式部份的哪里不懂!!!

PS老人家说教:以下刺眼= =+
功课就是要你花心思、花时间、找资料把他完成的...
上网请人完成你的功课,以后就学的会吗???
光丢着一句『我不会!帮我写!』
个人会建议你...
请转系吧!!!!这个系不适合你!!!!


先附上答案XD


献花 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
引用 | 编辑 rei
2009-01-02 21:27
9楼
  
下面是引用高应大一年级于2009-01-02 20:17发表的 : 到引言文
如何判断 水平 垂直 的直..不能有重复而已!!
.......

目前是没有看到递回的部份...

给个小提示...

直的、横的、九宫格....有着同一个特性

他们都是要检查9次....(包括本身那格)



另外另一个提示...

不知是否有学过『除法』...

『/』『%』的差异性?

0/9=?
0%9=?

1/9=?
1%9=?

2/9=?
2%9=?

3/9=?
3%9=?

4/9=?
4%9=?

5/9=?
5%9=?

6/9=?
6%9=?

7/9=?
7%9=?

8/9=?
8%9=?

9/9=?
9%9=?
...
直到
80/9=?
80%9=?

献花 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
引用 | 编辑 rei
2009-01-04 01:35
11楼
  
『/』『%』的差异性?

0/9=?
0%9=?

1/9=?
1%9=?

2/9=?
2%9=?

3/9=?
3%9=?

4/9=?
4%9=?

5/9=?
5%9=?

6/9=?
6%9=?

7/9=?
7%9=?

8/9=?
8%9=?

9/9=?
9%9=?
...
直到
80/9=?
80%9=?

以上的问题先求出答案...你会比较好想到要怎么解...

算完之后在配上这个图去想...
答案应该就呼之欲出了!!!!


献花 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 = ?
    }
}
C这边要取阵列元素好像只能sizeof()
有点忘了 表情

献花 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
引用 | 编辑 高应大一年级
2009-01-06 13:36
14楼
  
下面是引用teldeanmac85于2009-01-06 12:37发表的 : 到引言文
其实做法有很多   这个让你参考
请自行修改   因为最近没有太多时间
看你问了那么多天   作业也应该交出去了
刚刚中午休息匆忙的写一下
你可以试试看
.......



谢谢你表情 
(我输出怎DOS跑出来0.5秒..之后就不见了)

但是 我必须是用递回的方式
递回与FOR 回圈


如果是用递回的方式呢!!是要写在哪里啊??
用在 check_column 函式里面 也没用表情
int a;

a=check_column(n-1)+check_column(n-2);

献花 x0
引用 | 编辑 高应大一年级
2009-01-06 13:52
15楼
  
下面是引用rei于2009-01-04 01:35发表的 : 到引言文


以上的问题先求出答案...你会比较好想到要怎么解...

算完之后在配上这个图去想...
答案应该就呼之欲出了!!!!
[attachment=467116]




for ( a=0;a<80;a++ ){
   cout<<a<<"/9="<< a/9<<endl;
   cout<<a<<"%9="<<a%9<<endl;
}


我只知道用FOR 回圈去写而已

但是之后 我就不懂了

献花 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发表的 : 到引言文
 


谢谢你表情 
(我输出怎DOS跑出来0.5秒..之后就不见了)

但是 我必须是用递回的方式
递回与FOR 回圈


如果是用递回的方式呢!!是要写在哪里啊??
用在 check_column 函式里面 也没用表情
int a;

a=check_column(n-1)+check_column(n-2);


献花 x0
引用 | 编辑 rei
2009-01-06 23:43
17楼
  
下面是引用高应大一年级于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
引用 | 编辑 高应大一年级
2009-01-09 14:51
18楼
  
我知道!!

谢谢你们这段时间的指导!!

虽然到最后还是做不出来 表情 表情

但有尸体可以交了!!
还要写报告原因

抱歉:因为平常有在打工,回到家都很晚了,所以都会忘记回覆,请见谅...

C++真难
下学期有物件导向,不知道会不会死很惨 表情

献花 x0
引用 | 编辑 leacks
2009-01-09 17:46
19楼
  
复制程式
这属于c的问题
c++的菁华应该不是用来跑dos介面吧!
话说判断直跟横是否有相同值不是很简单?
aa[][i] i++
aa[i][] i++
这样不就好了
==============
而其余的在八后棋中搭配google一定会有答案
毕竟数独程式出来很久了,都有人做在网页上还有autorun
其余的跟rei相似意见


献花 x0