使用 C 語言中的堆疊結構來實現 Eight Queens 問題

發布 科技 2024-03-02
11個回答
  1. 匿名使用者2024-02-06

    關於。

    data[top]==data[i] 來判斷它是否在同一列中。

    abs(data[top]-data[i]))==(top-i) 確定它是否為對角線。

    我認為 i 0 7 可以理解為從上到下的 0 7 行(共 8 行)。

    儲存女王位置的 data[i] 與 data[i] 不同!

    也就是說,當資料充滿 8 個數字時,它就是乙個成功的鐘擺,例如,參見下面的“第乙個鐘擺”:

    在這種情況下,資料中的數字是 ,並且只記錄女王在每行中的位置。

    這樣,女王的位置可以像這樣表示:(第 i 行,列資料[i]),坐標點在左上角。

    再看頂部,這個演算法的機制是,在判斷乙個位置時,它會壓入這個位置(用它作為頂部),然後將這個位置與本身存在的女王進行比較。

    當 data[top]=data[i] 時,要判斷的女王的列與前乙個女王相同,因此此判斷返回 false

    然後判斷對角線,這個問題的解決方法很簡單,比較(top,data[top]),i,data[i]的兩個位置。

    即 (row top, column data[top]) 和 (row i, column data[i]) 比較位置。

    top-i 表示:這兩個位置之間相差多少行,data[top]-data[i]) 表示:這兩個位置之間相差多少列(可能是負數)。

    abs() 函式採用絕對值。

    abs(data[top]-data[i]) == (top-i)

    如果相隔的行數和列數相隔,那麼這兩個位置都在對角線上,不要相信你畫了你。

    在詳細條件下,一般是這樣判斷的(無論坐標點在哪個角度,下面以數學坐標軸為例):

    對於一點 p1(x1,y1) 和 p2(x2,y2)。

    如果 x1+x2 = x2+y2,則表示沿對角線(左上角到右下角)發生碰撞。

    如果 x1-y2 = x2-y2,則表示沿相反對角線(右上角到左下角)發生碰撞。

    看了很久,我覺得你的演算法很好,我學會了。

  2. 匿名使用者2024-02-05

    if(data[top]==data[i]||abs(data[top]-data[i]))==(top-i))

    這是為了確定放置在當前行中的女王是否與前一行的女王在同一條垂直線上或對角線上。

    資料陣列儲存以下內容:data[i] 表示第 i 行的後後放置在列 data[i] 上。

    另外,噴我上面的滴2貨,這個方法很好,用遞迴是菜鳥的方法,寫程式要注重效率。

  3. 匿名使用者2024-02-04

    他說,如果你用乙個堆疊,你真的用乙個堆疊??

  4. 匿名使用者2024-02-03

    #include

    #include

    int judge(int *p, int j) 判斷棋子的當前位置是否符合規則,如果是好訂單,則返回 1,否則滑回 0;

    int i;

    for(i=0;iif(p[j]==p[i]) return 0;

    if(abs(p[j]-p[i])=j-i) return 0;

    return 1;

    int main()

    int a[8];a[i] 表示第 i 行之後的位置(a[3]=0 表示第 3 行中的皇后在第 0 列)。

    int i=0,j=0,k=0;

    for(a[0]=0;a[0]<8;j=0,a[j]++for(a[++j]=0;a[j]<8;j=1,a[j]++if(judge(a,j))

    for(a[++j]=0;a[j]<8;j=2,a[j]++if(judge(a,j))

    for(a[++j]=0;a[j]<8;j=3,a[j]++if(judge(a,j))

    for(a[++j]=0;a[j]<8;j=4,a[j]++if(judge(a,j))

    for(a[++j]=0;a[j]<8;j=5,a[j]++if(judge(a,j))

    for(a[++j]=0;a[j]<8;j=6,a[j]++if(judge(a,j))

    for(a[++j]=0;a[j]<8;a[j]++if(judge(a,j))

    for(i=0;i. “爭吵 8; i++)printf("%d",a[i]);

    printf("%3s","

    if(!(k%7)) printf("");

    printf("總共有 %d 個解決方案",k);

    return 0;

  5. 匿名使用者2024-02-02

    樓下**有點問題,就是這樣,剛通過它測試除錯了一下,如果還有問題就523117894了

    #include

    enum boolean ;

    enum boolean a[9] ,b[17] ,c[17] ;檢查皇后之間是否存在衝突。

    int s[9];

    void main()

    elsefor(i=1;i<=8;i++)

    printf("");}

  6. 匿名使用者2024-02-01

    **如下,有乙個問題,嗨,我。

    #include

    enumboolean;

    enumbooleana[9],b[17],c[17];檢查皇后之間是否存在衝突。

    ints[9];

    voidmain()

    elsefor(i=1;i<=8;i++)

    printf("");}

  7. 匿名使用者2024-01-31

    本主題使用遞迴方法,如樓上的方法。

  8. 匿名使用者2024-01-30

    以下是 8 個女王計畫:

    #include

    #include

    void eightqueen(int a[99],int n);

    void print(int a[99]);

    int up(int a[99],int row,int col);

    int down(int a[99],int row,int col);

    int left(int a[99],int row,int col);

    int right(int a[99],int row,int col);

    int num=0;

    main()

    n;將女王的位置放在二維陣列中,a[i][j]=1 表示該位置有乙個女王。

    eightqueen(a,0);

    system("pause");

    return 0;

    void print(int a[99]) 輸出一種合理的方法。

    printf("");

    printf("");

    void eightqueen(int a[99],int row) 通過回溯來計算 8 個女王的移動。

    elsea[row][col]=0;}}

    確定同一等級中是否有其他女王。

    int up(int a[99],int row,int col)

    return 0;

    確定同一條線上是否有其他蜂后。

    int down(int a[99],int row,int col)

    return 0;

    確定對接線上從左上角到右下角是否有其他蟻后。

    int left(int a[99],int row,int col)

    if(((row-i)>=0)&&col-i)>=0))}

    return 0;

    確定對接線上從左下角到右上角是否有其他蟻后。

    int right(int a[99],int row,int col)

    if(((row-i)>=0)&&col+i)<8))這裡的判斷有問題,}

    return 0;}

  9. 匿名使用者2024-01-29

    方法如下,不知道是否符合。

    方法:回溯法。

    想來想去,不難發現,每一行每一列,恰好都有乙個皇后。 如果使用 c[x] 來表示 x 行中女王的列號,則 rook 問題就變成了完全排列生成問題。 0-7 整行有 8 個階乘 = 40320 列舉,不超過它。

    編寫遞迴列舉程式(遞迴程序已使用堆疊)。

    當主程式讀取 n 時,tot 是數字(清除),search(0) 被呼叫

    void search(int cur)

    if(ok) search(cur+1);合法,遞迴地繼續}}

    檢查衝突主要是因為女王是水平的,垂直的,傾斜的不能對立,你可以自己弄清楚,而tot是乙個全域性變數。

    這裡只是找出了多少種放置方式,並且沒有設定列印**,您可以自己弄清楚。

  10. 匿名使用者2024-01-28

    (1)全程安排。

    自然數 1 n 排列成 n!中等排列稱為完整排列。

    例如,3 的完整排列是 2 1 of 3!= 6 種。

    2)8個皇后(或n個皇后)。

    保證8個皇后不能互相攻擊,即保證每橫行、每豎行、每對角線行最多可以有乙個皇后。

    讓我們拋開第三個條件,如果每個水平行和每個垂直行只有乙個女王。

    用坐標標記 8*8 板。 讓我們討論以下解決方案之一:

    q - q -

    q - q -

    q - q - q -

    q - 如果用坐標表示,則為:(1,8) (2,4) (3,1) (4,3) (5,6) (6,2) (7,7) (8,5)。

    將橫坐標按順序排列,縱坐標為 8 4 1 3 6 2 7 5。 這是 1 8 的完整排列。

    我們將 1 8 的完整排列放入輸入 a(a[0] a[7]),然後 8 個女王的坐標是 (i+1,a[i]),其中 i 是 0 7。

    這將確保任何兩個不會位於同一行或同一列上。

    放在對角線上,要知道,兩點之間的直線斜率的絕對值是1或-1,是同一條斜線,充分條件是|x1-x2|=|y1-y2|(兩點的坐標為(x1,y1)(x2,y2))。 我們在輸出時做出判斷,如果任何兩點滿足上述等式,則判斷為失敗,不會輸出。

    附在下面:新增必要的注釋,其中通過檢視注釋應該可以理解完全安排的實現:

    #include

    #include

    #include

    #include

    int printed;

    此函式用於繪圖,此處省略以節省空間。

    讀者只需新增 draw(a,k); 刪除注釋以繪製圖片。

    void draw(int* a,int k)

    int i,j;

    for(i=0;i

  11. 匿名使用者2024-01-27

    #include

    #include

    #define max 8

    int queen[max],sum=0;

    void show()

    printf(")");

    sum;int place(int n) 可防止最大皇后位於同一列且位於同一對角線上。

    return 1;

    void nqueens(int n)

    else}}

    int main(void)

相關回答
9個回答2024-03-02

該問題的原意是實現乙個佇列有兩個堆疊的功能。 >>>More

7個回答2024-03-02

第乙個 if(!) a) 表示如果 a 等於零,則取 x——第二個和第三個表示如果 b 和 c 不為 0,則執行它。 >>>More

15個回答2024-03-02

include: 此標頭檔案宣告了所有 IO 操作所需的基本服務,即支援流的輸入和輸出操作,例如程式中的 cin 和 cout >>>More

9個回答2024-03-02

範圍。 你靜態字元 *chh;

static char *ch1;雖然兩個指標指向的位址沒有變化,但你有沒有想過它們指向的記憶體位址是否已經釋放,char chc[10]; 它是本地的,函式已經結束,生命週期已經結束,你正在嘗試使用 void times() 中的指標訪問它。 >>>More

5個回答2024-03-02

這些不是巨集定義,而是檔案包含。

該巨集定義乙個字串,如下所示:define identifier。 >>>More