n皇后问题 (回溯法) 原创
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
•隐约束:
1)不同列:
xixj
2)不处于同一正、反对角线:
|i-j||xi-xj|
代码实现:
class Queen{friend int nQueen(int)
private:
bool Place(int k);
void Backtrack(int t);
int n,//皇后个数
*n;//当前解
long sum;//当前已找到的可行方案数
};
bool Queen:
:Place(int k){for (int j=1;j<k;j++)
if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false;return true;}void Queen:
:Backtrack(int t){if (t>n) sum++;//达到叶结点
n
问题描述
在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
算法分析
•解向量:
(x1, x2, … , xn)
•显约束:
xi=1,2, … ,n
else
for (int i=1;i<=n;i++) {//搜索子结点
x[t]=i;//进入第i个子结点
if (Place(t)) Backtrack(t+1);}}
int nQueen(int n){Queen X;
//ቤተ መጻሕፍቲ ባይዱ始化X
X.n=n;
X.sum=0;
int *p=new int [n+1];
for(int i=0;i<=n;i++)
p[i]=0;
X.x=p;
X.Backtrack
(1);//对整个解空间回溯搜索
delete []p;
return X.sum;}运行结果:
1)不同列:
xixj
2)不处于同一正、反对角线:
|i-j||xi-xj|
代码实现:
class Queen{friend int nQueen(int)
private:
bool Place(int k);
void Backtrack(int t);
int n,//皇后个数
*n;//当前解
long sum;//当前已找到的可行方案数
};
bool Queen:
:Place(int k){for (int j=1;j<k;j++)
if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false;return true;}void Queen:
:Backtrack(int t){if (t>n) sum++;//达到叶结点
n
问题描述
在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
算法分析
•解向量:
(x1, x2, … , xn)
•显约束:
xi=1,2, … ,n
else
for (int i=1;i<=n;i++) {//搜索子结点
x[t]=i;//进入第i个子结点
if (Place(t)) Backtrack(t+1);}}
int nQueen(int n){Queen X;
//ቤተ መጻሕፍቲ ባይዱ始化X
X.n=n;
X.sum=0;
int *p=new int [n+1];
for(int i=0;i<=n;i++)
p[i]=0;
X.x=p;
X.Backtrack
(1);//对整个解空间回溯搜索
delete []p;
return X.sum;}运行结果: