N皇后問題

2021-06-16 23:46:49 字數 954 閱讀 1429

問題:題目**於西洋棋的玩法,因為皇后所在的位置可以縱向、橫向、兩個斜向四個方向的「捕捉」,所以8皇后問題就是要求如何布置8個皇后在8*8的棋盤上而使他們互相無法「捕捉」。也就是說不存在兩個皇后同行或同列,或在同一斜線上。而n皇后問題就是如何布置n個皇后在n*n棋盤裡使不存在兩個皇后在同行同列和同一斜線上

題解:給棋盤的行和列都編上1到n的號碼,皇后也給編上1到n的號碼。由於乙個皇后應在不同的行上,為不失一般性,可以假定第i個皇后將放在第i行上的某列。因此n皇后問題的解空間可以用乙個n元組(x1,x2,.....xn)來表示,其中xi是放置皇后i所在的列號。這意味著所有的解都是n元組(1,2,3,.......,n)的置換。解空間大小為n!。其次我們看約束條件:因為解空間已經給我們排除了不在同一行(因為每個皇后分別已經對應不同的行號)的約束條件。我們要判斷的是不在同一列和不在同一斜線的約束。因為xi表示皇后所在的列號,所以如果存在x(k)=x(i)那麼肯定存在第k個皇后和第i個皇后同列。所以不同列的判段條件是x(k)!=x(i),1程式設計基本思路:x(j)表示乙個解的空間,j表示行數,裡面的值表示可以放置在的列數,抽象約束條件得到能放置乙個皇后的約束條件(1)x(i)!=x(k);(2)abs(x(i)-x(k))!=abs(i-k)。應用回溯法,當可以放置皇后時就繼續到下一行,不行的話就返回到第一行,重新檢驗要放的列數,如此反覆,直到將所有解解出。

**:

#include#include#includeusing namespace std;

int f[20];//f[i]=j,表示在第i行第j列放置乙個皇后,相當於壓縮成一維

bool put_suitable(int k)

if (f[k]<=n)//說明在n列內找到了乙個可行的情況

printf("\n");

}else

}else

}printf("%d\n\n",num);

} return 0;

}

N皇后問題

include define maxqueens 20 define minqueens 4 enum bool typedef struct queendata queendata queendata queens maxqueens 1 int ncount init int init chec...

N皇后問題

採用遞迴回溯法 執行結果 輸入8 對於n皇后解的個數,參考 當n 16時,構造法給出解,參考poj 3239 一 當n mod 6 2 且 n mod 6 3時,有乙個解為 2,4,6,8,n,1,3,5,7,n 1 n為偶數 2,4,6,8,n 1,1,3,5,7,n n為奇數 上面序列第i個數為...

N皇后問題

q n皇后問題。請問如何在n n棋盤上無衝突的擺放n個皇后棋子,即任一皇后所在位置的水平 垂直 45 斜線上均不能有其他皇后棋子。include include define max depth 20 int isok queen int n,int i,int j,int q max depth ...