八皇后问题

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解。

八皇后问题

方法一:递归实现

方法二:迭代实现

方法三:利用全排列递归实现

实现代码如下:

 

#include<iostream>

#include<cmath>

using namespace std;

bool place(int *Q,int len,int index);

bool check(int *Q,int len);

void Queue1(int *Q,int len,int index);

void Queue2(int *Q,int len);

void Queue3(int *Q,int len,int index);

int main()

{

	int len;

	cin>>len;//输入皇后的个数

	int *Q=new int[len+1];//Q[0]暂不使用

	cout<<"method1:"<<endl;

	Queue1(Q,len,1);

	cout<<"method2:"<<endl;

	Queue2(Q,len);

	cout<<"method3:"<<endl;

	for(int i=1;i<=len;i++)

		Q[i]=i;

	Queue3(Q,len,1);

	delete []Q;

	return 0;

}

///////////////////////////////////////////////////////////////////////////////////

bool place(int *Q,int len,int index)

{

	int i;

    for(i=1;i<index;i++)

	{

        if(Q[index]==Q[i]||abs(index-i)==abs(Q[index]-Q[i]))

            return false;

	}

    return true;

}

//递归实现

void Queue1(int *Q,int len,int index)

{

	if(Q==NULL||len<=0)

		return;

	if(index>len)

	{

		static int num1=1;

		cout<<num1++<<":";

		for(int i=1;i<=len;i++)

			cout<<Q[i]<<" ";

		cout<<endl;

	}

	else

	{

		for(int i=1;i<=len;i++)

		{

			Q[index]=i;

			if(place(Q,len,index))

				Queue1(Q,len,index+1);

		}

	}

}

/////////////////////////////////////////////////////////////////////////////////

//非递归实现

void Queue2(int *Q,int len)

{

	int i,k;

    for(i=1;i<=len;i++)

        Q[i]=0;

    k=1;

    while(k>=1)

    {

        Q[k]=Q[k]+1;   //在下一列放置第k个皇后

        while(Q[k]<=len&&!place(Q,len,k))

            Q[k]=Q[k]+1;//搜索下一列

        if(Q[k]<=len&&k==len)//得到一个输出

        {

			static int num2=1;

			cout<<num2++<<":";

            for(i=1;i<=len;i++)

                cout<<Q[i]<<" ";

            cout<<endl;

        }

        else if(Q[k]<=len&&k<len)

            k=k+1;//放置下一个皇后

        else

        {

            Q[k]=0;//重置Q[k],回溯

            k=k-1;

        }

    }

}

/////////////////////////////////////////////////////////////////////////////////////

//检查全排列是否符合摆放要求

bool check(int *Q,int len)

{

	for(int i=1;i<=len;i++)

    {

        for(int j=i+1;j<=len;j++)

        {

            if(abs(j-i)==abs(Q[j]-Q[i]))

				return false;

        }

	}

	return true;

}

//利用全排列实现

void Queue3(int *Q,int len,int index)

{

	if(Q==NULL||len<=0)

		return;

    if(index>len)

    {

        if(check(Q,len))//对生成每个全排列进行检查,若符合要求则输出

        {

            static int num3=1;

			cout<<num3++<<":";

			for(int i=1;i<=len;i++)

				cout<<Q[i]<<" ";

			cout<<endl;

        }

    }

    else

    {

        for(int i=index;i<=len;i++)

        {

            int temp=Q[i];

            Q[i]=Q[index];

            Q[index]=temp;



			Queue3(Q,len,index+1);



			temp=Q[index];

            Q[index]=Q[i];

            Q[i]=temp;

        }

    }

}


 


 

你可能感兴趣的:(八皇后)