八皇后问题是经典的回溯的问题,好久之前就看到一种解法发现好难理解,和我自己想的完全不一样,然后就一直把其想得特别复杂,也是耽搁蛮久的一道题目,今天就要把它给终结。
题目就是棋盘放棋子的问题,要保证互相之间不能相互攻击,所以,思想就是:假设棋盘的第一行的第一个就放棋子,然后判断是否符合,如果符合就在可以放的第二行的地方放第二个棋子,一直这样不断循环,直到所有可能的情况符合后退出就可以了。实现代码如下:(还没上算法课,所以语言可能不是很专业)
有问题可以提问,喜欢我的博客可以点赞,刚才看见有一个人喜欢,好开心啊~mua~
#include<bits/stdc++.h>
using namespace std;
int que[8],coun=0;
/*这个que数组就是存放放的位置,
比较巧妙的就是,下标代表所在的行,
所代表的值就是在那一行棋子所在的位置,
例如:que[4]=5,就是代表第四行(从0行开始)
棋子放在第五格(从0格开始)coun就是计数器,
代表所有可能的数*/
bool is_ok(int row){
//判断放的位置是否符合不相互的攻击的函数
for(int i=0;i<row;i++){
if(que[row]==que[i]||fabs(que[i]-que[row])==fabs(i-row))
return false;
//que[row]==que[i]判断同一列是否放了多颗棋子
//fabs(que[i]-que[row])==fabs(i-row)这是一个公式的变形
//写成比较好理解的形式就是:
//que[i]+i==que[row]+row;判断斜右边是否有多颗棋子
//que[i]-i==que[row]-row;判断斜左边是否有多颗棋子
}
return true;
}
void queen(int row)
{
if(row==8){
coun++;//到了终点,计数器加一,退出
return ;
}
for(int i=0;i<8;i++){
que[row]=i;//放棋子
if(is_ok(row))
//判断可以后继续放下一颗
queen(row+1);
}
}
int main()
{
queen(0);
cout<<coun<<endl;
return 0;
}
Emmmmmmm,不知道为什么代码一团糟了,改了下,抱歉 Q A Q……
N皇后问题也可以解决的,可以输出四个皇后问题的放置情况,只有两种可以试试,感觉倍儿成就感~~~