zoukankan      html  css  js  c++  java
  • 求解n皇后

    要求:在国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法

    思路:很直观的想法就是在棋盘上一个一个皇后的摆,如果冲突,则摆放在另一个位置,直至此次可以把n各皇后摆好而不产生冲突,则说明此种方法为一个解。然后将最后一个放置的皇后换个位置摆放,直至不产生冲突为止。很显然,此种思路即为算法中的回溯算法。

    基于此思路代码如下:
    #include<iostream>
    using namespace std;
    int const N =17;
    static int count=0;
    int x[N];
    int n;
    int conflict(int k)  //参数k为要放置的第k个皇后
    {   
        int i;   
        for(i=1;i<k;i++)   
          if(abs(k-i)==abs(x[k]-x[i]) || x[k] == x[i])   
            return 1;   
        return 0;   
    }   
    int queen(int k)//参数k为要放置第k个皇后
    {
    	if(k>n&&n>0)//k为已放置的皇后数,如果在一次递归中已放置的皇后数大于
    			//要放置的皇后数则说明此次递归过程为一个解
    		count++;
    	else
    	{
    		for(int t=1;t<=n;t++)
    		{
    			x[k]=t;//标明第k个皇后放在第t行
    			if(!conflict(k))
    				queen(k+1);
    		}
    	}
    	return count;
    }
    void main()
    {
    	cout<<"请输入皇后的个数"<<endl;
    	cin>>n;
    	cout<<n<<"皇后的解个数为"<<queen(1)<<endl;
    }
    

    程序运行结果如下:


  • 相关阅读:
    给定圆心和半径在圆内随机画点
    mqtt使用二(集成到java代码中)
    mqtt使用一
    vue的细节
    mongodb学习一(使用mongoResposity)
    jadx-gui for Mac
    对xx面APP进行分析
    使用jeb对某圈进行协议分析
    proxifier 安卓模拟器设置全局代理fq
    安卓开启真机调试ro.debuggable 1修改ro属性
  • 原文地址:https://www.cnblogs.com/hainange/p/6334086.html
Copyright © 2011-2022 走看看