n後問題(回溯遞迴法 C )

2021-09-24 01:27:37 字數 1216 閱讀 7252

引數:

n:表示棋盤大小nxn,也表示皇后的個數

x[i]:存放第i個皇后所在列數

sum:可行解總數

注意:

任意兩個皇后不能再同一斜線上,是乙個隱約束,應將其轉為顯約束。

對於nxn方陣上的同一斜線,分為兩種:主對角線及平行線(即斜率為-1的直線),副對角線及平行線(即斜率為+1的直線)。其中斜率為-1的直線,行號-列號值必定相等,斜率為1的直線,行號+列號必定相等。因此,若2個皇后的位置分別為(i,j)和(k,l),且i-j=k-l或i+j=k+l,則說明2個皇后在同一斜線上。以上兩個方程分別等價於k-i=l-j和k-i=j-i,所以,只要|k-i|=|j-l|,就表明2個皇后在同一斜線上。從而將隱約束轉為了顯約束。

說明:只需要兩個函式即可完成n後問題,分別為place(int k)和queen(int t)。

其中place(int t)為判斷函式,用於判斷第k個皇后是否能放在某一位置;queen(int t)為求所有可行方案的函式,用於列印所有可行方案和可行方案總數。

**如下:

// nqueen.cpp: 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include using namespace std;

int sum = 0;

//判斷函式,判斷第k個皇后是否可以放在某一位置(k,x[k])

bool place(int k,int *x)

return true;

}//求解可行解函式。

//輸出:列印出n個皇后所在位置

void queen(int t,int n,int *x)

cout << endl;

} else

} }}

int main()

queen(1,n,x);

cout << sum << endl;

return 0;

}

執行結果:

遞迴法解決N皇后問題

n皇后問題 在乙個n n的棋盤上面放置n個皇后,要使得任意兩個皇后之間不能相互攻擊,規則是任意兩個皇后處在同一行,同一列或者同一斜線的位置上時,能夠相互攻擊,皇后可以走任意步。通過分析題目可以知道,若使任意兩個皇后都不能互相攻擊,那麼就必須使得任意兩個皇后不能處在同一行,同一列,同一斜線即可 隱藏條...

n後問題 回溯法求解(遞迴與非遞迴)

n後問題要求在乙個n n格的棋盤上放置n個皇后,使得他們彼此不受攻擊。按照西洋棋的規則,乙個皇后可以攻擊與之處在同一行或同一列或同一斜線上的其他任何棋子。因此,n後問題等價於要求在乙個n n的棋盤上放置n個皇后,使得任何2個皇后不能被放在同一行或同一列或同一斜線上。用回溯法解n後問題時,可以用一顆完...

回溯之n後問題

n後問題 在 n n格的棋盤上放置彼此不受攻擊的 n個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於在 n n格的棋盤上放置 n個皇后,任何 2個皇后不放在同一行或同一列或同一斜線上。解向量 x1,x2,xn 顯約束 xi 1,2,n 隱約束 1 不同列...