N皇后问题的一个程序,请大家看看!帮忙修改
2013-01-02 23:57
531 查看
#include <stdio.h>
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
class Queen{
friend int nQueen(int);
private: bool Place(int k);
void Backtrack(int t);
void display(); int n, //皇后个数
* x; //当前解
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++; //到达叶结点,搜索到一个解
display();
cout<<'\n';
} else
for (int i=1;i<=n;i++)
{ x[t]=i;
if (Place(t)) Backtrack(t+1);
}
}
void Queen::display( ){
//输出n个皇后在棋盘图形上的位置
int i,j;
int queenq[100][100];
for ( i=1; i<=n; i++)
for ( j=1; j<=n; j++)
queenq[i][j] =0;
//初始化棋盘图形矩阵
for ( i=1; i<=n; i++)
if (x[i]) queenq[i][x[i]] =1;
//为棋盘图形矩阵赋值
for( i=1;i<=n;i++){
//输出棋盘图形
cout << "(" <<" ";
for ( j = 1; j<=n; j++)
if(queenq[i][j]) cout << "Q" << " ";
else cout << "*" << " ";
cout << ")" << endl;
}
}
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;
}
void main( )
{
int n,sum;
while(1)
{
cout << "用递归回溯法解n后问题"<<"\n"<<endl;
cout << "请输入皇后的数目(不超过16个): ";
cin >> n;
sum = nQueen(n);
cout << "一共有"<<sum<<"种情况"<<endl;
cout<<"\n"<<endl;
}
}
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
class Queen{
friend int nQueen(int);
private: bool Place(int k);
void Backtrack(int t);
void display(); int n, //皇后个数
* x; //当前解
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++; //到达叶结点,搜索到一个解
display();
cout<<'\n';
} else
for (int i=1;i<=n;i++)
{ x[t]=i;
if (Place(t)) Backtrack(t+1);
}
}
void Queen::display( ){
//输出n个皇后在棋盘图形上的位置
int i,j;
int queenq[100][100];
for ( i=1; i<=n; i++)
for ( j=1; j<=n; j++)
queenq[i][j] =0;
//初始化棋盘图形矩阵
for ( i=1; i<=n; i++)
if (x[i]) queenq[i][x[i]] =1;
//为棋盘图形矩阵赋值
for( i=1;i<=n;i++){
//输出棋盘图形
cout << "(" <<" ";
for ( j = 1; j<=n; j++)
if(queenq[i][j]) cout << "Q" << " ";
else cout << "*" << " ";
cout << ")" << endl;
}
}
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;
}
void main( )
{
int n,sum;
while(1)
{
cout << "用递归回溯法解n后问题"<<"\n"<<endl;
cout << "请输入皇后的数目(不超过16个): ";
cin >> n;
sum = nQueen(n);
cout << "一共有"<<sum<<"种情况"<<endl;
cout<<"\n"<<endl;
}
}
相关文章推荐
- 自己写了一个程序,不知道错那了,大家帮忙看看
- 一个ASP.NET2.0的问题,实在无法解决,请大家帮忙看看(放在首页一天后撤下,请DUDU原谅)问题已经解~~^_^
- 一个面向对象的js问题 大家帮忙看看
- 进行一个调查,谢谢大家,请问:您是如何回避除程序以外的问题带来的效率浪费
- c语言:输出500-600以内的所有素数,还是纠错的一个程序,大家看看
- 一个很急的问题!大家帮忙,散分!!!
- 一个select查询的问题,大家帮忙看下
- 大家来帮忙看看啊,为什么老是显示LINK : 没有找到 C:/Documents and Settings/Administrator/桌面/端口扫描/Debug/端口扫描.exe 或上一个增量链接没有生成它;正在执行完全链接
- 一个C程序~ 大家都来看看那~
- 代码问题,大家来帮忙看看啊
- 网站seo 的问题大家帮忙看看是什么原因。
- 安装软件时出了个怪问题,我截了个图。大家帮忙看看
- 新手问题,大家帮忙看看..谁有意见散分给谁哦!
- 项目二在写的一个网盘管理程序, 目前是半成品, 贴几张图给大家看看.
- 各位大牛帮忙看看问题出来哪?自己实现一个数组模板类,编译无法通过
- 一个可能存在Bug的二分查找方法的实现,大家一起看看有什么问题没
- 计划搞一个程序来应对客户的修改标记问题
- 初接触c语言,请大家帮忙看看问题出在哪了!
- 一个为扩展过的自定义DataGridiew控件提供多行表头重绘所需的TreeNode和Columns代码,以满足列自动增加的功能。大家看看帮忙优化下
- 刚刚接触C 好多都不懂 大家帮忙看看 这个程序错哪了