回溯算法之n皇后问题

来源:互联网 发布:单片机pwm模块长啥样 编辑:程序博客网 时间:2024/06/08 10:42

n皇后问题

输出8皇后问题所有结果。

输入
n:棋盘的行列
输出
每个结果第一行是No n:的形式,n表示输出的是第几个结果;下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的结果;依次类推。

输入样例
8
输出样例
输出的前几行:
No 1:
A…….
….A…
…….A
…..A..
..A…..
……A.
.A……
…A….
No 2:
A…….
…..A..
…….A
..A…..
……A.
…A….
.A……
….A…

#include <iostream>//#include "Queen.h"#include <cmath>using namespace std;//int main() {//  int n;//  cin >> n;//  int* x = new int[n + 1];//  for (int i = 0; i <= n; i++) {//      x[i] = 0;//  }////  Queen queen = Queen(n, x);//  queen.BackTrack(1);////  for (int i = 1; i <= n; i++) {//      cout << x[i] << " ";//  }//  cout << endl;//  cout << queen.getSum() << endl;//  delete[] x;////  return 0;////}const int n = 8;int X[n+1]; //当前解 x[i] 表示第i个皇后放在第i行 第x[i]列int sum = 0;char A[n+1][n+1] = { 0 };void output();void BackTrack(int i);int main() {    for (int i = 1; i <= n; i++) {        X[i] = 0;    }    for (int i = 1; i <= n; i++) {        for (int j = 1; j <= n; j++) {            A[i][j] = '.';        }    }    BackTrack(1);//  cout << sum<<endl;    return 0;}void  output() {    for (int i = 1; i <= n; i++) {        for (int j = 1; j <= n; j++) {            cout << A[i][j];        }        cout << endl;    }}bool isPlace(int k) {  //判断第k个皇后是否可以放在第k行、第X[k]列    //k肯定和i不相同,即行数不会相同    //判断列x[i] != x[k]    //判断对角线 直角等腰三角形  |行差| == |列差|    for (int i = 1; i < k; i++) { //每行检查        if ((X[i] == X[k]) || (abs(i - k) == abs(X[i] - X[k]))) {            return false;        }    }    return true;}void BackTrack(int i) { //回溯查找,    if (i > n) // 节点数为n层    {        sum++;        cout << "No " << sum << ":" << endl;        for (int i = 1; i <= n; i++) {            A[i][X[i]] = 'A';        }        output();        for (int i = 1; i <= n; i++) {            for (int j = 1; j <= n; j++) {                A[i][j] = '.';            }        }    }    else {        for (int j = 1; j <= n; j++) {  //遍历每行的n个节点            X[i] = j; //第i个皇后处在第j列            if (isPlace(i)) { //如果可以放                BackTrack(i + 1);            }        }    }}
0 0
原创粉丝点击