用回溯法解决八数码问题(不要递归的)
											用回溯法解决八数码问题(不要递归的)										
					
	 程序代码:
程序代码:【原创】试探法求解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;
}
你看看是不是你想要的。


 
											





 
	    

 
	
