n皇后问题不用回溯法的解决办法

whoamami 2003-08-22 12:28:05
对于n皇后问题(n>=4),常见的解法是回溯,这将占用不少内存,下面的程序在一个循环里分步做试探,直到将n个皇后都成功放在了棋盘上,然后打印出结果;空间复杂度为O(n)。VC6.0中通过。

我的想法是:在一般的情况下,能否将回溯算法都改成这种形式?请各位发表意见!

#include "stdafx.h"

#include <iostream.h>

#define B_ 'X'
#define W_ 'O'

int CheckValid(int col,int row,int* board,int dim)
{
int i,j;

if(!board)return 0;
if(dim<4)return 0;
if(col<0 || col>=dim
|| row<0 || row>=dim)return 0;

i=col+1;
while(i<dim)
{
if(board[i]==row)
{
return 0;
}
i++;
}

i=col+1;
j=row-1;
while(i<dim && j>=0)
{
if(board[i]==j)
{
return 0;
}
i++;
j--;
}

i=col+1;
j=row+1;
while(i<dim && j<dim)
{
if(board[i]==j)
{
return 0;
}
i++;
j++;
}

return 1;
}

void PrintResult(int* board,int dim)
{
int i,j;
char* s=0;

if(!board)return;
if(dim<4)return;

s=new char[dim+1];
if(!s)
{
cout<<endl<<"Memroy not enough!"<<endl;
return;
}

cout<<endl<<"------------------"<<endl;
for(i=0;i<dim;i++)
{
s[i]=B_;
}
s[dim]='\0';
for(i=0;i<dim;i++)
{
for(j=0;j<dim;j++)
{
if(board[j]==i)
{
s[j]=W_;
cout<<s<<endl;
s[j]=B_;
break;
}
}
}

delete []s;
}

void main(void)
{
int dim=0,col;
int* idx=0;
int sum=0;

cout << "input dim = ";
cin >> dim;
if(dim<4)return;

idx=new int[dim];
if(!idx)
{
return;
}
for(col=0;col<dim;col++)
{
idx[col]=-1;
}

cout<<endl<<"Dimension="<<dim<<endl;

col=dim-1;
while(col>=0 && col<dim)
{
idx[col]++;
if(idx[col]>=dim)
{
idx[col]=-1;
col++;
continue;
}
if(CheckValid(col,idx[col],idx,dim))
{
if(col==0)
{
sum++;
PrintResult(idx,dim);
}
else
{
col--;
}
}
}

cout<<endl<<"sum="<<sum<<endl;

delete []idx;
}

...全文
203 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cybergate 2003-08-24
  • 打赏
  • 举报
回复
kbsoft(景乐)

你说的应该是求一个解吧。

皇后的算法复杂度是O(N^N),N=5000的时候,就算把所有的解列举出来,恐怕也要花上几亿年。
kbsoft 2003-08-24
  • 打赏
  • 举报
回复
sorry,刚才查了一下,是求一个解:-(
kbsoft 2003-08-24
  • 打赏
  • 举报
回复
我是在一篇论文中看到的,可以解到很大,最大可以到1000000.
kbsoft 2003-08-24
  • 打赏
  • 举报
回复
当然是所有解.你所谓的是回溯搜索算法.
寻开心 2003-08-23
  • 打赏
  • 举报
回复
递归或者是回朔算法用到了堆栈,来保存一些中间状态,在N比较大的时候很可能造成内存溢出。而非递归的循环算法是直接输出结果,不保留中间的状态,所以可以处理更大的N的。
loewe 2003-08-23
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2059/2059607.xml?temp=3.771609E-02

这里面有的,自己找找吧
kbsoft 2003-08-23
  • 打赏
  • 举报
回复
N=5000时,大约要>40s
寻开心 2003-08-22
  • 打赏
  • 举报
回复
n皇后的问题,在固定行或者列的顺序的情形下,列或者是行坐标的排列顺序就是数字1到n的全排列。递归回朔不是唯一的,循环当然可以解决。
llwu 2003-08-22
  • 打赏
  • 举报
回复
像8皇后这样的本质是求全排列的递归问题有非递归做法,本质是自己在模拟递归,完成进出栈工作,空间复杂度的确是O(n)的。

但实际写程序,递归会带来很大的方便,8皇后用递归写,栈可以放在全局,递归调用是顶多重复开一个循环变量i的空间,不会浪费太大空间的。

to kbsoft(景乐) :你可以做到N=5000?是指求全解,简单的方法不可能的,做到13都不错了(1s内)。
kbsoft 2003-08-22
  • 打赏
  • 举报
回复
N=5000时应该没问题

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧