另类的八皇后求解法.

类别:编程语言 点击:0 评论:0 推荐:

老师当初评论,”垃圾”,垃圾就垃圾,管他呢,反正是原创

//heckBoard.h

#pragma once

class CheckBoard
{
public:
 CheckBoard(void);
 ~CheckBoard(void);
 
private:
 int *Arr,*J1,*J2;
public:
 void Arrange(int i);
 bool Judge(void);
 void OutPut(void);
private:
 int cout;//记录符合情况的棋盘摆局数量
};
//heckBoard.cpp

#include "StdAfx.h"
#include ".\heckboard.h"

CheckBoard::CheckBoard(void): cout(0)
{
 Arr=new int[8];
 J1=new int[15];
 J2=new int[15]; //8*8棋盘中的棋子行数+列数,行数-列数,均有15种不同结果。
 for(unsigned int i=0;i<8;i++)
 {
  *(Arr+i)=i;
 }//初始化棋盘,使得每列只有一个棋子
}

CheckBoard::~CheckBoard(void)
{
 delete []Arr;delete []J1;delete []J2;
}

//棋盘的摆局,共判断8!次
void CheckBoard::Arrange(int i)
{
 if(i==0)
 {
  this->Judge();
  return;
 }
 for(int j=0;j<=i;j++)
 {
  if(j>0)
  {
   if(j%2)
   {
    int b=*(Arr+i);*(Arr+i)=*(Arr+j-1);*(Arr+j-1)=b;
   }
   else
   {
    int b=*(Arr+i);*(Arr+i)=*(Arr+i-j);*(Arr+i-j)=b;
   }
  }
  Arrange(i-1);
   if((i+1)%2)
  {
   for(int k=0;k<i/2;k++)
   {
                int c;c=Arr[k];Arr[k]=Arr[i-2-k];Arr[i-2-k]=c;
   }
  } 
 } 
}

//盘断此刻棋盘摆局和不合乎要求
bool CheckBoard::Judge(void)

 for(int i=0;i<15;i++)
 {
  J1[i]=0;J2[i]=0;
 }
 for(int i=0;i<8;i++)
 {
  if(J1[i+Arr[i]]==1)
return false;
  else   J1[i+Arr[i]]=1;
     if(J2[7+i-Arr[i]]==1)
   return false;
  else   J2[7+i-Arr[i]]=1;
 }
cout+=1;OutPut();
   return true;
}

//输出棋盘布局
void CheckBoard::OutPut(void)
{
 for(unsigned int i=0;i<8;i++)
 {
  printf("%d  ",Arr[i]);
 }
printf("\n%d\n\n\n",cout);
}

 

// 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "heckBoard.h"
int _tmain(int argc, _TCHAR* argv[])
{
 CheckBoard *pQueen=new CheckBoard;

 pQueen->Arrange(7);

 delete pQueen;
 


 return 0;
}

本文地址:http://com.8s8s.com/it/it27896.htm