您的位置:首页 > 其它

8皇后问题(回溯法)

2018-03-24 00:18 148 查看
//8皇后(回溯法)

#include <iostream>
using namespace std;

void queen_all(int k);//回溯的算法函数
int col[9];
bool row[9], digLeft[17], digRight[17];

int main()
{
int j;

for (j = 0; j <= 8; j++)  row[j] = true;
for (j = 0; j <= 16; j++) digLeft[j] = digRight[j] = true;

queen_all(1);

return 0;
}

//8*8棋盘的第K列上找合理的配置
void queen_all(int k)
{

int i, j;
char awn;                 //存储是否继续寻找的标志

for (i = 1; i <= 8;i++)   //依次在1至8行上配置K列的皇后

if (row[i] && digLeft[k+i-1] && digRight[8+k-i]){                      //可行位置
col[k] = i;                                                 //表示位置为K列的i行
row[i] = digLeft[k+i-1] = digRight[8+k-i] = false;                        //表示置有皇后

if (k == 8){                                                     //找到一个可行解
for (j = 1; j <= 8; j++) 
cout << j << " " << col[j] << '\t';                      //列和行

cout << endl << "是否需要继续寻找(Q--表示退出,其他继续:)";
cin >> awn;
if (awn == 'Q'|| awn == 'q') exit(0);
}

else queen_all(k + 1);                                   //递归至k+1列
row[i] = digLeft[k+i-1] = digRight[8+k-i] = true;       //为下个可行方案做准备

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: