RSS   



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


 


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


今日心情

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

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

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

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

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

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

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



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


今日心情

 . 積分: 127
 . 精華: 1
 . 文章: 2242
 . 收花: 136 支
 . 送花: 41 支
 . 比例: 0.3
 . 在線: 1053 小時
 . 瀏覽: 7780 頁
 . 註冊: 8027
 . 失蹤: 18
#2 : 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  新增/修改 爬文標記
sfredr
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30


今日心情

 . 積分: 127
 . 精華: 1
 . 文章: 2242
 . 收花: 136 支
 . 送花: 41 支
 . 比例: 0.3
 . 在線: 1053 小時
 . 瀏覽: 7780 頁
 . 註冊: 8027
 . 失蹤: 18
#3 : 2005-4-11 01:13 AM     全部回覆 引言回覆


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

嗯嗯~

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



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


今日心情

 . 積分: 127
 . 精華: 1
 . 文章: 2242
 . 收花: 136 支
 . 送花: 41 支
 . 比例: 0.3
 . 在線: 1053 小時
 . 瀏覽: 7780 頁
 . 註冊: 8027
 . 失蹤: 18
#4 : 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  新增/修改 爬文標記
sfredr
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30


今日心情

 . 積分: 127
 . 精華: 1
 . 文章: 2242
 . 收花: 136 支
 . 送花: 41 支
 . 比例: 0.3
 . 在線: 1053 小時
 . 瀏覽: 7780 頁
 . 註冊: 8027
 . 失蹤: 18
#5 : 2005-4-11 07:40 PM     全部回覆 引言回覆

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

不過已經來不及了Orz

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



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

   



 



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