用回溯法解决八数码问题(不要递归的)
用回溯法解决八数码问题(不要递归的)
2010-06-12 18:36
程序代码:【原创】试探法求解N皇后问题C++编程
2010-06-01 20:39:21 阅读9 评论0 字号:大中小
终于让我给想出来了!哈哈!
#include <iostream>
#include <cmath>
using namespace std;
class Queen
{
public:
Queen(int n);
void Print();
void Move(int m);
void Fill1(int data);
void Fill0();
public:
int ci;
int num;
int qipan[20+1][20+1];
int pt[20+1];
};
Queen::Queen(int n)
{
ci=0;
pt[0]=0;
num=n;
for(int i=1;i<=num;i++)
for(int j=1;j<=num;j++)
qipan[i][j]=0;
Move(1);
}
void Queen::Fill0()
{
for(int i=1;i<=num;i++)
for(int j=1;j<=num;j++)
if(qipan[i][j]==pt[0])
qipan[i][j]=0;
}
void Queen::Fill1(int data)
{
int hang=pt[0];
int lie=pt[pt[0]];
int i;
for(i=1;i<=num;i++)
{
if(qipan[hang][i]==0)
qipan[hang][i]=data;
if(qipan[i][lie]==0)
qipan[i][lie]=data;
}
if(hang+lie<=num)
{
for(i=1;i<=hang+lie-1;i++)
if(qipan[hang+lie-i][i]==0)
qipan[hang+lie-i][i]=data;
}
else
{
for(i=(hang+lie)%num;i<=num;i++)
if(qipan[hang+lie-i][i]==0)
qipan[hang+lie-i][i]=data;
}
if(hang>lie)
{
for(i=1;i<=num-hang+lie;i++)
if(qipan[hang-lie+i][i]==0)
qipan[hang-lie+i][i]=data;
}
else
{
for(i=1+lie-hang;i<=num;i++)
if(qipan[hang-lie+i][i]==0)
qipan[hang-lie+i][i]=data;
}
}
void Queen::Move(int m)
{
pt[0]++;
for(int i=1;i<=num;i++)
{
if(qipan[m][i]==0)
{
pt[pt[0]]=i;
Fill1(pt[0]);
Move(m+1);
}
}
Print();
{
pt[0]--;
Fill0();
m=pt[0];
}
}
void Queen::Print()
{
if(pt[0]>num)
{
ci++;
cout<<"第"<<ci<<"种解法:"<<endl;
for(int i=1;i<=num;i++)
{
for(int j=1;j<=num;j++)
{
if(j==pt[i])
cout<<"@ ";
else
cout<<"* ";
}
cout<<endl;
}
}
}
int main()
{
Queen q(9);
return 0;
}
你看看是不是你想要的。
2010-06-16 21:51
2010-06-22 21:15