zoukankan      html  css  js  c++  java
  • 八皇后问题

    八皇后问题是一个以国际象棋为背景的问题:如何能够在 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;
            }
        }
    }
    



  • 相关阅读:
    SIP穿越NAT SIP穿越防火墙-SBC
    安卓SAX解析XML文件
    C#进阶系列——WebApi 异常处理解决方案
    C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
    C#进阶系列——WebApi 接口参数不再困惑:传参详解
    C#进阶系列——WebApi 身份认证解决方案:Basic基础认证
    C#进阶系列——WebApi 跨域问题解决方案:CORS
    C#进阶系列——WebApi 接口测试工具:WebApiTestClient
    微信公众平台向特定用户推送消息
    JSONP跨域的原理解析
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3318137.html
Copyright © 2011-2022 走看看