RSS   



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


 


 
主題: [資訊電機] [求助]精典題型八皇后...   字型大小:||| 
GERRYccc
名譽版主
等級: 8等級: 8
凹~~嗚~~^^y

今日心情

 . 積分: 103
 . 文章: 597
 . 收花: 497 支
 . 送花: 754 支
 . 比例: 1.52
 . 在線: 446 小時
 . 瀏覽: 7391 頁
 . 註冊: 8017
 . 失蹤: 170
 . ~@.@~ TWed2k 星球
#1 : 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 頁
 . 註冊: 8017
 . 失蹤: 170
 . ~@.@~ TWed2k 星球
#2 : 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  新增/修改 爬文標記
GERRYccc
名譽版主
等級: 8等級: 8
凹~~嗚~~^^y

今日心情

 . 積分: 103
 . 文章: 597
 . 收花: 497 支
 . 送花: 754 支
 . 比例: 1.52
 . 在線: 446 小時
 . 瀏覽: 7391 頁
 . 註冊: 8017
 . 失蹤: 170
 . ~@.@~ TWed2k 星球
#3 : 2005-4-12 12:08 AM     全部回覆 引言回覆

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

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



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

   



 



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