RSS   



  可打印版本 | 推薦給朋友 | 訂閱主題 | 收藏主題 | 純文字版  


 
 16  1/2  1  2  > 


 
主題: [資訊電機] [求助]精典題型八皇后...   字型大小:||| 
sfredr
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30


今日心情

 . 積分: 127
 . 精華: 1
 . 文章: 2242
 . 收花: 136 支
 . 送花: 41 支
 . 比例: 0.3
 . 在線: 1053 小時
 . 瀏覽: 7780 頁
 . 註冊: 8210
 . 失蹤: 201
#1 : 2005-4-10 04:39 PM     只看本作者 引言回覆

這次我們資料結構要交的作業是用C語言寫出一個八皇后的程式

可是我實在一點頭緒都沒有

去google查...結果找到的原始碼都是套了一堆我不知道拿來做什麼的.h的標頭檔...

這又讓我一個頭兩個大了...

不過看那些原始碼...大概知道要用遞迴來跑..可是大致的流程實在是讓我傷腦筋...

請教各位大概的結構要怎麼寫阿...



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
Acute
論壇第一大毒王
等級: 18等級: 18等級: 18等級: 18等級: 18
論壇第一小神童

 . 積分: 3281
 . 精華: 8
 . 文章: 11574
 . 收花: 14037 支
 . 送花: 3260 支
 . 比例: 0.23
 . 在線: 323 小時
 . 瀏覽: 2250 頁
 . 註冊: 8216
 . 失蹤: 5568
#2 : 2005-4-10 05:34 PM     只看本作者 引言回覆

皇后在西洋棋裏面, 只能走橫直兩條路
所以, 一個8x8 的棋盤, 可以讓8 個皇后各據一位置而不會互相侵犯
因此, 程式重點在於, 在放上第一個皇后之後, 搜索整個盤面, 把其他皇后逐一擺上去
擺法就是, 放上去的位置, 在橫向跟縱向都不會遇到另一個皇后
最簡單的方法, 就是用一個8x8 的二維陣列, 剛開始全部設為0
皇后一旦確定位置, 就設為1, 這樣子, 只要檢查縱橫方向有沒有不為零, 就知道能不能放皇后了

至於寫法上... 應該有各種方法吧... 看你要用啥方法應該都可以
你可以先寫了, 再Post 出來討論, 不然也不知道你有遇到啥困難勒

如果題目只是把8 個皇后擺上去, 問題就變得很單純
如果是要求, 算出可以有幾種擺法, 那就比較複雜
因為需要確認每個擺法是否曾經出現過, 呵

Acute.



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
sfredr
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30


今日心情

 . 積分: 127
 . 精華: 1
 . 文章: 2242
 . 收花: 136 支
 . 送花: 41 支
 . 比例: 0.3
 . 在線: 1053 小時
 . 瀏覽: 7780 頁
 . 註冊: 8210
 . 失蹤: 201
#3 : 2005-4-11 12:26 AM     只看本作者 引言回覆

#include <stdio.h>
#define Q 8
void printAnswer(int rows[]);
int valid(int rows[]);
static int count = 0;
int main()
{
        int rows[Q];
        for (rows[0] = 0; rows[0] < Q; rows[0]++)
                for (rows[1] = 0; rows[1] < Q; rows[1]++)
                        for (rows[2] = 0; rows[2] < Q; rows[2]++)
                                for (rows[3] = 0; rows[3] < Q; rows[3]++)
                                        for (rows[4] = 0; rows[4] < Q; rows[4]++)
                                                for (rows[5] = 0; rows[5] < Q; rows[5]++)
                                                        for (rows[6] = 0; rows[6] < Q; rows[6]++)
                                                                for (rows[7] = 0; rows[7] < Q; rows[7]++)
                                                                        if (valid(rows))
                                                                                        printAnswer(rows);
        printf("一共有%d組解\n",count);
}

void printAnswer(int rows[])
{
        int i;
        printf("第%d種解:",count + 1);
        for (i = 0; i < Q; i++)
                printf("%2d", rows + 1);
        printf("\n");
        count++;
}

int valid(int rows[])
{
        int i, j;
        int diff;
        for (i = 0; i < Q - 1; i++)
                for (j = i + 1; j < Q; j++)
                {
                        if (rows == rows[j])
                                return 0;
                        diff = rows - rows[j];
                        if (diff < 0)
                                diff = -diff;
                        if (diff == j - i)
                                return 0;
                }
        return 1;
}

以上...很詭異的八層巢狀迴圈...有沒有辦法改的好看一點呀?

[sfredr 在 2005-4-11 01:43 AM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
Wingtt
鐵驢友〔初級〕
等級: 4


 . 積分: 33
 . 精華: 1
 . 文章: 27
 . 收花: 126 支
 . 送花: 3404 支
 . 比例: 27.02
 . 在線: 384 小時
 . 瀏覽: 1481 頁
 . 註冊: 7314
 . 失蹤: 4462
#4 : 2005-4-11 01:10 AM     只看本作者 引言回覆


引用:
Acute寫到:
皇后在西洋棋裏面, 只能走橫直兩條路
所以, 一個8x8 的棋盤, 可以讓8 個皇后各據一位置而不會互相侵犯
因此, 程式重點在於, 在放上第一個皇后之後, 搜索整個盤面, 把其他皇后逐一擺上去
擺法就是, 放上去的位置, 在橫向跟縱向都不會遇到另一個皇后
最簡單的方法, 就是用一個8x8 的二維陣列, 剛開始全部設為0
皇后一旦確定位置, 就設為1, 這樣子, 只要檢查縱橫方向有沒有不為零, 就知道能不能放皇后了

至於寫法上... 應該有各種方法吧... 看你要用啥方法應該都可以
你可以先寫了, 再Post 出來討論, 不然也不知道你有遇到啥困難勒

如果題目只是把8 個皇后擺上去, 問題就變得很單純
如果是要求, 算出可以有幾種擺法, 那就比較複雜
因為需要確認每個擺法是否曾經出現過, 呵

Acute.

小弟印象中皇后可以走橫直斜的
只能走橫值得好像是城堡的樣子
如果記錯的話還請指證^^"



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
sfredr
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30


今日心情

 . 積分: 127
 . 精華: 1
 . 文章: 2242
 . 收花: 136 支
 . 送花: 41 支
 . 比例: 0.3
 . 在線: 1053 小時
 . 瀏覽: 7780 頁
 . 註冊: 8210
 . 失蹤: 201
#5 : 2005-4-11 01:13 AM     只看本作者 引言回覆


引用:
Wingtt寫到:
小弟印象中皇后可以走橫直斜的
只能走橫值得好像是城堡的樣子
如果記錯的話還請指證^^"

嗯嗯~

橫直斜都不能擺棋子...



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
Acute
論壇第一大毒王
等級: 18等級: 18等級: 18等級: 18等級: 18
論壇第一小神童

 . 積分: 3281
 . 精華: 8
 . 文章: 11574
 . 收花: 14037 支
 . 送花: 3260 支
 . 比例: 0.23
 . 在線: 323 小時
 . 瀏覽: 2250 頁
 . 註冊: 8216
 . 失蹤: 5568
#6 : 2005-4-11 03:28 AM     只看本作者 引言回覆

呵呵... sorry, 是我記錯了 ^^"
橫直斜都不能放
sfredr... 你那個程式是你寫的吧?
嚴重不對哩 @_@
至少要8x8 的二維陣列, 才有辦法記錄一個棋盤
你只用一維陣列... 是無法記錄的喔

還有, 你的題目是要擺出一個? 還是求出所有解?
兩個相差很多很多哩 @_@

Acute.



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
sfredr
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30


今日心情

 . 積分: 127
 . 精華: 1
 . 文章: 2242
 . 收花: 136 支
 . 送花: 41 支
 . 比例: 0.3
 . 在線: 1053 小時
 . 瀏覽: 7780 頁
 . 註冊: 8210
 . 失蹤: 201
#7 : 2005-4-11 03:54 AM     只看本作者 引言回覆


引用:
Acute寫到:
呵呵... sorry, 是我記錯了 ^^"
橫直斜都不能放
sfredr... 你那個程式是你寫的吧?
嚴重不對哩 @_@
至少要8x8 的二維陣列, 才有辦法記錄一個棋盤
你只用一維陣列... 是無法記錄的喔

還有, 你的題目是要擺出一個? 還是求出所有解?
兩個相差很多很多哩 @_@

Acute.

不過我跑出來了說Orz...是跑出所有的解...
我用上面的解去玩八皇后的程式都ok說..剛好放的進去
那個一維陣列是用來記錄棋子放在y軸上的第幾個...
之所以沒有x軸是因為我一行一行去跑...所以跑的有點慢...
因為整個棋盤上的y軸的格子我全部都會放上去...再去檢查有沒有問題...
下面是大概的流程

將陣列rows初始為一儲存八個元素之陣列,進入主程式後開始for迴圈,先將第0個位置,也就是棋盤上的(1,1)佔據,然後開始找第二排的旗子可放之處,也就是棋盤上的(1,2)開始放棋,以此類推,跑到if判斷式後進入Valid函數開始檢查,首先檢查rows[ i ] == rows[j],若等式成立代表兩個棋子在同一y軸上,固直接傳回0的值,再找尋下一個棋子擺放處是否正確;若rows[ i ] == rows[j]等式不成立,則將rows[ i ]-rows[j]的值傳給bevel,此bevel變數代表右下角的斜邊是否有擺放棋子,若等於j-i則代表在目前的棋子的斜邊上有棋子占據,所以傳回0,若小於0則代表斜邊目前沒有棋子占據,固將傳回1,則int main()中的if條件式成立,進入void answer(int rows[])將目前的解法印出。
各列之值代表棋子所擺放之y軸,如:1 5 8 6 3 7 2 4
則代表(1,1)(2,5)(3,8)(4,6)(5,3)(6,7)(7,2)(8,4)各放上一顆棋子。

[ i ]會變斜體..所以我多空一格

[sfredr 在 2005-4-11 03:59 AM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
Acute
論壇第一大毒王
等級: 18等級: 18等級: 18等級: 18等級: 18
論壇第一小神童

 . 積分: 3281
 . 精華: 8
 . 文章: 11574
 . 收花: 14037 支
 . 送花: 3260 支
 . 比例: 0.23
 . 在線: 323 小時
 . 瀏覽: 2250 頁
 . 註冊: 8216
 . 失蹤: 5568
#8 : 2005-4-11 05:07 AM     只看本作者 引言回覆

呵, 我沒有細看你程式如何記錄, sorry ^^"
跑出來就好
如果要去除回圈, 就得使用遞回的方式寫
例如: (我按照你程式的結構改的, 等於只改掉main & 加一個遞回程序, 其餘一樣)

int rows[Q];  //變數改到這兒, 減少參數傳遞, 免得更慢
void Queen (int i)
{
   if ( i < Q )
      for (rows[i]=0 ; rows[i] < Q ; rows[i]++)
         Queen (i+1);
   else if (valid(rows))
      printAnswer(rows);
}

int main()
{

   Queen(0);
   printf("一共有%d組解\n",count);
}
上面的方式, 只是單純的去除迴圈, 變成遞迴模式
基本上, 程式應該會比你原來的跑的更慢, 因為遞迴不是加速, 而是讓程式變得簡單
要加速的話, 就必須導入資料結構的一些方法, 減少不必要的retry
通常在資料結構裏面, 都是介紹用tree 的方法
PS: 程式我沒測試喔, 但是應該不會錯啦 ^^"
      只是簡單的去迴圈, 應該不至於敲錯才對

Acute.

[Acute 在 2005-4-11 05:09 AM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
Acute
論壇第一大毒王
等級: 18等級: 18等級: 18等級: 18等級: 18
論壇第一小神童

 . 積分: 3281
 . 精華: 8
 . 文章: 11574
 . 收花: 14037 支
 . 送花: 3260 支
 . 比例: 0.23
 . 在線: 323 小時
 . 瀏覽: 2250 頁
 . 註冊: 8216
 . 失蹤: 5568
#9 : 2005-4-11 05:19 AM     只看本作者 引言回覆

嗯... 忽然想到... 多加一個去除同樣的迴圈, 應該就可以加速了
也就是, 上面那個遞迴函式改為:

void Queen (int i)
{
   int j ;

   if ( i < Q )
      for (rows[i]=0 ; rows[i] < Q ; )  // 這兒不遞加, 由新增loop 決定
      {
         Queen (i+1);
         rows[i]++ ;                        // 原本上層迴圈最後+1 搬到這兒
         for ( j=0 ; j < i ; j++ )          // 增加檢查是否已經跟以前重複的迴圈
            if ( rows[j] == rows[i] )     // 如果已經重複,
               rows[i]++ ;                  //       則直接跳過該值, 換下一個
      }
   else if (valid(rows))
      printAnswer(rows);
}
多加一個loop決定下一次要try 的數值
這樣子, 理論上程式執行時間, 應該變成上一個的約... 1/8 時間
而且, 這種程式要遞迴模式才可以寫
不然每層迴圈內都要加一層這種code, 程式會看得眼花撩亂, 呵

Acute.



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
GERRYccc
名譽版主
等級: 8等級: 8
凹~~嗚~~^^y

今日心情

 . 積分: 103
 . 文章: 597
 . 收花: 497 支
 . 送花: 754 支
 . 比例: 1.52
 . 在線: 446 小時
 . 瀏覽: 7391 頁
 . 註冊: 8212
 . 失蹤: 103
 . ~@.@~ TWed2k 星球
#10 : 2005-4-11 03:43 PM     只看本作者 引言回覆


引用:
Acute寫到:
...

void Queen (int i)
{
   int j ;

   if ( i < Q )
      for (rows[ i ]=0 ; rows[ i ] < Q ; )  // 這兒不遞加, 由新增loop 決定
      {
         Queen (i+1);
         rows[ i ]++ ;                        // 原本上層迴圈最後+1 搬到這兒
         for ( j=0 ; j < i ; j++ )          // 增加檢查是否已經跟以前重複的迴圈
            if ( rows[ j ] == rows[ i ] )     // 如果已經重複,
               rows[ i ]++ ;                  //       則直接跳過該值, 換下一個
      }
   else if (valid(rows))
      printAnswer(rows);
}

...
Acute.


嘿嘿,又抓到一個地方了…難怪一直編譯錯誤! 希望不要又抓錯
使用DEV-C++ 上面紅色部分無法編譯!且原 sfredr 兄 給我的程式碼(非版面上)
也不是用printAnswer 呵呵…
上面紅色字改成 answer(rows); 即可正常編譯!
阿Q給花給花有兩篇皆有同樣錯…30朵

[GERRYccc 在 2005-4-11 03:53 PM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
GERRYccc
名譽版主
等級: 8等級: 8
凹~~嗚~~^^y

今日心情

 . 積分: 103
 . 文章: 597
 . 收花: 497 支
 . 送花: 754 支
 . 比例: 1.52
 . 在線: 446 小時
 . 瀏覽: 7391 頁
 . 註冊: 8212
 . 失蹤: 103
 . ~@.@~ TWed2k 星球
#11 : 2005-4-11 03:50 PM     只看本作者 引言回覆



/*
將陣列rows初始為一儲存八個元素之陣列,
進入主程式後開始for迴圈,先將第0個位置,
也就是棋盤上的(1,1)佔據,然後開始找第二排的旗子可放之處,
也就是棋盤上的(2,1)開始放棋,以此類推,
跑到if判斷式後進入Valid函數開始檢查,
首先檢查rows[i] == rows[j],若等式成立代表兩個棋子在同一y軸上,
固直接傳回0的值,再找尋下一個棋子擺放處是否正確;
若rows[i] == rows[j]等式不成立,則將rows[i]-rows[j]的值傳給bevel,
此bevel變數代表右下角的斜邊是否有擺放棋子,
若等於j-i則代表在目前的棋子的斜邊上有棋子占據,所以傳回0,
若小於0則代表斜邊目前沒有棋子占據,固將傳回1,
則int main()中的if條件式成立,進入void answer(int rows[])將目前的解法印出。
*/
#include <stdio.h>
#define Q 8
void answer(int rows[]);
int valid(int rows[]);
static int count = 0;

int rows[Q];
void Queen (int i)
{
   int j ;
   if ( i < Q )
      for (rows[i]=0 ; rows[i] < Q ; )  // 這兒不遞加, 由新增loop 決定
      {
         Queen (i+1);
         rows[i]++ ;                        // 原本上層迴圈最後+1 搬到這兒
         for ( j=0 ; j < i ; j++ )          // 增加檢查是否已經跟以前重複的迴圈
            if ( rows[j] == rows[i] )     // 如果已經重複,
               rows[i]++ ;                  //       則直接跳過該值, 換下一個
      }
   else if (valid(rows))
      answer(rows);
}

int main()
{
   Queen(0);
   printf("一共有%d組解\n",count);
   getchar();
   printf("請按Enter鍵繼續...");
}

//副程式
int valid(int rows[])
{
        int i, j;
        int bevel;
        for (i = 0; i < Q - 1; i++)
                for (j = i + 1; j < Q; j++)
                {
                        if (rows[i] == rows[j])
                                return 0;
                        bevel = rows[i] - rows[j];
                        if (bevel < 0)
                                bevel = -bevel;
                        if (bevel == j - i)
                                return 0;
                }
        return 1;
}

void answer(int rows[])
{
        int i;
        printf("第%d種解:",count + 1);
        for (i = 0; i < Q; i++)
                printf("%2d", rows[i] + 1);
        printf("\n");
        count++;
}
另外補上我依毒王講解所修改的程式碼,採用遞迴方式。
以經由DEV-C++編譯執行測試過,無誤! 有發現錯誤請指教^^"
sfredr 兄 也別忘了給我喔~呵呵

[GERRYccc 在 2005-4-11 03:55 PM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
Acute
論壇第一大毒王
等級: 18等級: 18等級: 18等級: 18等級: 18
論壇第一小神童

 . 積分: 3281
 . 精華: 8
 . 文章: 11574
 . 收花: 14037 支
 . 送花: 3260 支
 . 比例: 0.23
 . 在線: 323 小時
 . 瀏覽: 2250 頁
 . 註冊: 8216
 . 失蹤: 5568
#12 : 2005-4-11 06:13 PM     只看本作者 引言回覆


引用:
GERRYccc寫到:

引用:
Acute寫到:
...

void Queen (int i)
{
   int j ;

   if ( i < Q )
      for (rows[ i ]=0 ; rows[ i ] < Q ; )  // 這兒不遞加, 由新增loop 決定
      {
         Queen (i+1);
         rows[ i ]++ ;                        // 原本上層迴圈最後+1 搬到這兒
         for ( j=0 ; j < i ; j++ )          // 增加檢查是否已經跟以前重複的迴圈
            if ( rows[ j ] == rows[ i ] )     // 如果已經重複,
               rows[ i ]++ ;                  //       則直接跳過該值, 換下一個
      }
   else if (valid(rows))
      printAnswer(rows);
}

...
Acute.


嘿嘿,又抓到一個地方了…難怪一直編譯錯誤! 希望不要又抓錯
使用DEV-C++ 上面紅色部分無法編譯!且原 sfredr 兄 給我的程式碼(非版面上
也不是用printAnswer 呵呵…
上面紅色字改成 answer(rows); 即可正常編譯!
阿Q給花給花有兩篇皆有同樣錯…30朵



我真是被你打敗
你自己都會說, 你手上的程式非版面上的
那我是看版面上的東西回的, 當然按照版面上的
請去看原始Post 出來的程式碼, 就是用printAnswer 嘿嘿...
so... 反過來, 你欠我30朵花

Acute.



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
sfredr
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30


今日心情

 . 積分: 127
 . 精華: 1
 . 文章: 2242
 . 收花: 136 支
 . 送花: 41 支
 . 比例: 0.3
 . 在線: 1053 小時
 . 瀏覽: 7780 頁
 . 註冊: 8210
 . 失蹤: 201
#13 : 2005-4-11 07:40 PM     只看本作者 引言回覆

一篇一朵花啦~不用搶...

不過已經來不及了Orz

我今天已經把那詭異八層巢狀迴圈的程式碼交出去了...



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
GERRYccc
名譽版主
等級: 8等級: 8
凹~~嗚~~^^y

今日心情

 . 積分: 103
 . 文章: 597
 . 收花: 497 支
 . 送花: 754 支
 . 比例: 1.52
 . 在線: 446 小時
 . 瀏覽: 7391 頁
 . 註冊: 8212
 . 失蹤: 103
 . ~@.@~ TWed2k 星球
#14 : 2005-4-12 12:08 AM     只看本作者 引言回覆

雖然程式改出來了,可是咧。。我怎麼看不懂啊
看懂了怎麼去回圈改遞迴,可是看不懂程式原理怎跑的,rows[j] 的j 是多少從哪定義的?!

[GERRYccc 在 2005-4-12 11:37 AM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記
Acute
論壇第一大毒王
等級: 18等級: 18等級: 18等級: 18等級: 18
論壇第一小神童

 . 積分: 3281
 . 精華: 8
 . 文章: 11574
 . 收花: 14037 支
 . 送花: 3260 支
 . 比例: 0.23
 . 在線: 323 小時
 . 瀏覽: 2250 頁
 . 註冊: 8216
 . 失蹤: 5568
#15 : 2005-4-12 01:24 PM     只看本作者 引言回覆

假設你問我好了.... 因為你沒說哪個迴圈的rows[j] @_@
加速的方式很簡單, 每一層迴圈的下一個數值, 都先檢查前面幾層已經產生的數值
如果重複, 就已經是不可能的, 所以就不用拿去嘗試了, 可以直接檢查下一個數值

^^" 加速後的程式, 預估是剩下原來時間的1/8
這是因為我假設負載平衡的條件算的, 實際上應該更快
因為遞迴裏面的判斷式只判斷一個條件, 而valid() 裏面則有很複雜的判斷式
所以, 我應該可以確定實際上執行時間不到原來的1/8
當然, 這也是有數學原理的 ^^"

通常演算法的課程, 會提到這方面的數學模型推論
當然, 可以不用那麼複雜啦, 用最簡單的數學就可以進行簡易評估
^^" 誰想嘗試推論一下數學式阿, ccc

Acute.



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  新增/修改 爬文標記

 16  1/2  1  2  > 
   



 



所在時區為 GMT+8, 現在時間是 2024-11-22 12:57 AM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.031057 second(s), 6 queries , Qzip disabled