數獨 ......謝謝拉[已解決]

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