八皇后问题(回溯)n皇后问题

大四学生最近被面试,笔试,学习搞得很烦。感觉大脑啥都没有了,其实我以前不爱这些的。但最近发现这些可以让我平静,所以就看看。

好了,言归正传。

八皇后问题

其实这是一道很经典的算法入门题:题目简单的解释就是    皇上后宫佳丽三千,每个都是皇上的心头宝,为了不让这些佳丽吵架,影响自己也影响国家。皇上费尽心思终于想出了一个办法,给每个佳丽划分位置,让他们互不侵犯。(已知佳丽只走直线或者45度斜线)

怎么划分了,就是如图(画的不好请多海涵)      如果第一个皇后在第一个圆点的位置,那么她横着的一排,竖着的一排包括45度斜线这三条线上都不能住佳丽。依次同理,八皇后问题就是问当有八个皇后的时候有多少种摆放方式,或者说有多少种布局方式。

 

下面的代码我扩展到了n皇后问题 就是any queue ,

如果需要改成八皇后问题就不要输入直接把改成8便是。

#include<iostream>
#include<math.h>
using namespace std;


 int total =0;//一共有多少种方法

 bool getQueue(int r,int queues[]){

     for(int i=0 ; i<r ;i++){
        if(queues[r] == queues[i] || r-queues[r]==i-queues[i] || r+queues[r]==i+queues[i]){
            return false;
        }
     }
    return true;

 }

int queue(int r, int n, int queues[]){//r表示当前确定的是哪一行的皇后,n表示一个有多少个皇后,

    if(r==n){
        total++;
        cout<<"第"<<total<<"个皇后问题解法"<<endl;
        //*表示皇后  ~表示 空位置
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(j==queues[i])
                    cout<<"*";
                else
                    cout<<"~";
            }
            cout<<endl;
        }
    }else{
         for(int i=0;i!=n;i++){
            queues[r]=i;
            if(getQueue(r,queues)){ //解决当前位置能不能放皇后的问题。
                queue(r+1,n,queues); //进入下一个皇后位置摆放的查找
            }
         }
    }
}

int main(){
  int n;//用来记录几皇后问题
  cout<<"输入一个数据表示及皇后问题"<<endl;
  cin>>n;
  int queues[n];//用来记录每个皇后的位置

  queue(0,n,queues);//返回一共有多少种方法

  cout<<"总共有"<<total<<"摆放方法"<<endl;
}

注:上面那个故事我应该是很久以前听哪个老师讲的,如有侵犯请告知。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值