n皇后问题不用回溯法的解决办法
对于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;
}