第三次資料結構上機

2021-08-01 09:07:09 字數 2056 閱讀 4492

實驗題目

編寫乙個程式exp3-6.cpp,求解皇后問題:在n×n的方格棋盤上,放置n個皇后,要求每個皇后不同行、不同列、不同左右對角線。

要求:(1)皇后的個數n由使用者輸入,其值不能超過20,輸出所有的解。(2)採用類似於棧求解迷宮問題的方法。

實驗步驟

(包括基本設計思路、演算法設計、函式相關說明、輸入與輸出以及程式執行結果)

基本設計思路:回朔思想。

演算法設計:定義乙個棧sqstack,用於表示皇后棋盤的行數,定義乙個一維陣列向x=0,用於儲存棋盤中的列數(一維陣列可以直接防止皇后同行),每到一行,取棧頂元素e,x[e]++;然後判斷是否能放皇后,行則入棧一次,接著再次取棧頂元素,x[e]歸零,不行則x[e]++,直至x[e]增加加到n。如果該行都不能放皇后,則出棧一次,接著取棧頂元素,繼續上述過程。最後棧空時退出。

函式相關說明:void queens(int *x,intn,sqstack *&s);//進行回朔的過程

int judge(int *x,int k);//判斷是否能放皇后

//只要有某行(第i行)皇后與這個第k行的皇后處在同一列(x[i]=x[k])或者處在同一斜線(|i-k|=|x[i]-x[k]|),則立即返回假(0)

void print(int *x,int n);//列印結果函式

void initstack(sqstack*&s);//初始化棧,其中,將棧資料項全部賦值為1,2...20

void push(sqstack *&s);//進棧

void pop(sqstack *&s);//出棧

void gettop(sqstack *s,int&e);//取棧頂元素

bool stackempty(sqstack *s);判斷棧是否為空

輸入:4,5,10

輸出:見執行圖。

執行結果:

實驗心得體會

通過這次實驗,複習了回朔的解題方法,以及如何用棧解決問題,進一步熟悉了棧的使用。

源程式清單(**)

#include #include #include #include #include using namespace std;

typedef struct

sqstack;

void queens(int *x,int n,sqstack *&s);

int judge(int *x,int k);

void print(int *x,int n);

void initstack(sqstack *&s);

void push(sqstack *&s);

void pop(sqstack *&s);

void gettop(sqstack *s,int &e);

bool stackempty(sqstack *s);

int main()

int judge(int *x,int k)

void push(sqstack *&s)

void pop(sqstack *&s)

void gettop(sqstack *s,int &e)

bool stackempty(sqstack *s)

第三次資料結構作業

a.連續線段 題目描述 給定若干個線段,求最多的首尾相連的線段條數,線段 100 題目解決 我其實不太知道這道題目用現在的知識應該怎麼解?寫了個最短 長 路演算法,floyd那種的,怎麼抽象這個模型呢,就是把每乙個線段都抽象成圖論模型中的乙個點,如果兩條線段首尾相連就給他們倆中間連一條邊長為1的邊,...

C 第三次上機

題目一 假設有乙個字串strfilename d c 程式設計 實驗3 myfile.txt 使用字串方法,取出路徑中的檔名 myfile.txt 要求至少想出三種方法實現 1 using system using system.collections.generic using system.li...

PTA第三次上機

include include include using namespace std class polygon int perimeter 計算多邊形邊長 void display 輸出多邊形邊數和周長 int reachsidelen int polygon perimeter return ...