n皇后问题 c++
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了n皇后问题 c++相关的知识,希望对你有一定的参考价值。
试题描述
在一个国际棋棋盘上,放置n个皇后(n<10),使她们相互之间不能进攻。求出所有布局。
输入要求
一个自然数n,表示n个皇后。
输出要求
每行输出一种方案,每种方案顺序输出皇后所在的列号,每个数之间用空格隔开。
输入样例
4
输出样例
2 4 1 3
1 3 4 2
if(k==n)
for(int i=0;i<n;++i)
std::cout<<(pos[i]+1)<<" "<<std::ends;
std::cout<<std::endl;
else
for(int i=0;i<n;++i)
if(ok(k,i,pos))
pos[k]=i;
queen(n,k+1,pos);
bool ok(int rRow,int rPos,int pos[])
for(int i=0;i<rRow;++i)
if(pos[i]==rPos)return false;
if(abs(pos[i]-rPos)==(rRow-i))return false;
return true;
int main()
int n=8;
int pos[n];
queen(8,0,pos);
return 0;
参考技术A
简单遗传算法求解n皇后问题
八皇后问题
刚开始学习c++,代码有什么问题还欢迎各位指出
//通过修改宏可以解决n皇后的问题 #define MAX 8 #define ABS(x) ((x>0)?(x):-(x)) class Queen { private: int queen[MAX] ; public: Queen(); int Place(int); int Attack(int, int); int OutData(); ~Queen(); }; Queen::Queen() { //for (int i = 0; i < MAX; i++)queen[i] = 0; std::cout << "hello,welcome to eight Queen "; Place(0); } //排列下一个皇后 int Queen::Place(int p) { for (int i = 0; i < 8;i++) { if (!Attack(p, i)) { queen[p] = i; if (p == MAX - 1) OutData(); else { Place(p + 1); } } } return 0; } //判断是否收到攻击,受到攻击返回1,否则返回0 int Queen::Attack(int row, int col) { int flag = 0; //i<row可以保证不在同一行 for (int i = 0; i < row && !flag; i++) { int inc_row = ABS(i - row); int inc_col = ABS(queen[i] - col); //判断是否在同一列,是否在斜线上 flag = (col == queen[i]) || (inc_col == inc_row); } return flag; } int Queen::OutData() { for (int i = 0; i < MAX; i++) { for (int j = 0; j < MAX; j++) { if (j == queen[i])std::cout << "Q"; else std::cout << "-"; } std::cout << "\n"; } getchar(); return 0; } Queen::~Queen() { std::cout << "end" << std::endl; } int main() { Queen a; return 0; }
调试的时候会有一个问题,一直输出结果,经过仔细查看代码看出,由于递归调用,可以输出所有种类的结果,所以得对结果加以区分,加入getchar是为了输出一个结果
以上是关于n皇后问题 c++的主要内容,如果未能解决你的问题,请参考以下文章