實驗題目
編寫乙個程式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 ...