c_cpp 在n×n的格的棋盘上放置彼此不受攻击的Ñ个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.N后问题等价于在n×n的格的棋盘上放
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 在n×n的格的棋盘上放置彼此不受攻击的Ñ个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.N后问题等价于在n×n的格的棋盘上放相关的知识,希望对你有一定的参考价值。
//n后问题 回溯法计算 递归
#include "stdafx.h"
#include <iostream>
#include "math.h"
using namespace std;
class Queen
{
friend int nQueen(int);
private:
bool Place(int k);
void Backtrack(int t);
int n, // 皇后个数
*x; // 当前解
long sum; // 当前已找到的可行方案数
};
int main()
{
int n=4,m;
cout<<n<<"皇后问题的解为:"<<endl;
m=nQueen(n);
cout<<n<<"皇后问题共有";
cout<<m<<"个不同的解!"<<endl;
return 0;
}
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)//t扩展的是行
{
if (t>n)
{
sum++;
for (int i=1;i<=n;i++)
{
cout<<x[i]<<" ";
}
cout<<endl;
}
else
{
//探索第t行的每一列是否有元素满足要求
for (int i=1;i<=n;i++)
{
x[t]=i;
if (Place(t))
{
Backtrack(t+1);
}
}
}
}
int nQueen(int n)
{
Queen 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;
}
//n后问题 回溯法计算 迭代
#include "stdafx.h"
#include <iostream>
#include "math.h"
using namespace std;
class Queen
{
friend int nQueen(int);
private:
bool Place(int k);
void Backtrack(void);
int n, // 皇后个数
*x; // 当前解
long sum; // 当前已找到的可行方案数
};
int main()
{
int n=4,m;
cout<<n<<"皇后问题的解为:"<<endl;
m=nQueen(n);
cout<<n<<"皇后问题共有";
cout<<m<<"个不同的解!"<<endl;
return 0;
}
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()
{
x[1] = 0;
int k = 1;
while(k>0)
{
x[k] += 1;
while((x[k]<=n)&&!(Place(k)))//寻找能够放置皇后的位置
{
x[k] += 1;
}
if(x[k]<=n)//找到位置
{
if(k == n)
{
for (int i=1;i<=n;i++)
{
cout<<x[i]<<" ";
}
cout<<endl;
sum++;
}
else
{
k++;
x[k]=0;
}
}
else
{
k--;
}
}
}
int nQueen(int n)
{
Queen 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();
delete []p;
return X.sum;
}
以上是关于c_cpp 在n×n的格的棋盘上放置彼此不受攻击的Ñ个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.N后问题等价于在n×n的格的棋盘上放的主要内容,如果未能解决你的问题,请参考以下文章
回溯算法
n皇后问题
1295 N皇后问题
codevs 1295 N皇后问题
同行列对角线的格
N皇后问题(递归回溯)