八皇后问题(回溯法)

来源:互联网 发布:淘宝二手手机可靠店铺 编辑:程序博客网 时间:2024/05/16 23:51

  问题描述:在一张8×8的棋盘上,共放置八个皇后,任意两个皇后均不能在同一行、同一列或同一斜线上。

 

/*---------------------------------------------------------------------------------------       sum 表示所有可行的方案总数。   flag是含有8个元素的数组,第 i 个元素表示皇后放置在第 i 行的第 flag[i] 列上-----------------------------------------------------------------------------------------*///迭代版#include<iostream>using namespace std;#define N 8int sum = 0;int flag[8];void backtrace_I();bool conflict(int);bool conflict(int currentLevel){     //判断当前层所放位置与其前面各层是否有冲突for (int i = 1; i < currentLevel; i++){ //非同一列且非对角线if (flag[i] == flag[currentLevel] || abs(i - currentLevel) == abs(flag[i] - flag[currentLevel]))     return true;}return false;}void backtrace_I(){int num_level = 1;   //当前操作的是第几层while (num_level > 0){flag[num_level]++;while ( flag[num_level] <= N && conflict(num_level) )     //当前层的当前位置是否满足条件flag[num_level]++;          //不满足条件时,将皇后放置在当前层的下一个位置if (flag[num_level] <= N){         //如果当前层满足条件if (num_level == N){           //如果当前层是最后一层,打印本次排列方案for (int i = 1; i <= N; i++)cout << flag[i] << " ";cout << endl;sum++;}else{         //否则,转到下一层,并从下一层的第一列开始num_level++;flag[num_level] = 0;}}else{num_level--;   //回溯到上一层}}}int main(){backtrace_I();cout << "共有" << sum << "种排列方案" << endl;return 0;}

//递归版#include<iostream>using namespace std;#define N 8int sum = 0;int flag[8];void backtrace_R(int);bool conflict(int);bool conflict(int currentLevel){     //判断当前层所放位置与其前面各层是否有冲突for (int i = 1; i < currentLevel; i++){if (flag[i] == flag[currentLevel] || abs(i - currentLevel) == abs(flag[i] - flag[currentLevel]))return true;}return false;}void backtrace_R(int num_level){if (num_level > N){for (int i = 1; i <= N; i++)cout << flag[i] << " ";cout << endl;sum++;}else{for (int num_col = 1; num_col <= N; num_col++){flag[num_level] = num_col;if (!conflict(num_level))backtrace_R(num_level + 1);}}}int main(){backtrace_R(1);cout <<"共有"<<sum<<"种排列方案"<< endl;return 0;}

 
原创粉丝点击