大四学生最近被面试,笔试,学习搞得很烦。感觉大脑啥都没有了,其实我以前不爱这些的。但最近发现这些可以让我平静,所以就看看。
好了,言归正传。
八皇后问题
其实这是一道很经典的算法入门题:题目简单的解释就是 皇上后宫佳丽三千,每个都是皇上的心头宝,为了不让这些佳丽吵架,影响自己也影响国家。皇上费尽心思终于想出了一个办法,给每个佳丽划分位置,让他们互不侵犯。(已知佳丽只走直线或者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;
}
注:上面那个故事我应该是很久以前听哪个老师讲的,如有侵犯请告知。