当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

用穷举法解8皇后问题

    8皇后问题是数据结构书中一个非常经典的题目。书中一般使用回溯法来解。回溯法一般要借助递归来实现,递归却又不是一下子想的清楚的,所以比较难理解。穷举法虽然算法效率不高,当输入很大时几乎不可能求解,但是却比较容易理解。下面就是实现的代码。为了易于实现,只把问题规模控制在4皇后上。

 #include <iostream>
#include <cmath>
using namespace std;

void FourQueens()
{
    for (int i = 1; i != 5; ++i)
    {
        for (int j = 1; j != 5; ++j)
        {
            for (int k = 1; k != 5; ++k)
            {
                for (int r = 1; r != 5; ++r)
                {
                    if (i != j && j != k && k != r && k != i && r != i && r != j
                        && abs(j - i) != 1 && abs(k - j) != 1 && abs(r - k) != 1-

n>
                        && abs(k - i) != 2 && abs(r - i) != 3 && abs(r - j) != 2)
                    {
                        cout << i << " " << j << " " << k << " " << r << endl;
                        break;
                    }
                }
            }
        }
    }
}
int main()
{
    FourQueens();
    return 0;
}

    下面是严老师书上一副图,对理解上面的代码也很有帮助的。

    下面也给出8皇后问题使用回溯法的代码:

 #include <iostream>
#include <cmath>
using namespace std;

void PrintResult(int *arr, int n)
{
    for (int i = 1; i != n + 1; ++i)
        cout << "(" << i <<
"COLOR: #000000">"," << arr[i] << ")" << " ";
    cout << endl;
}
bool Verify(int *arr, int i)
{
    for (int k = 1; k != i; ++k)
        if (arr[k] == arr[i] || abs(i - k) == abs(arr[i] - arr[k]))
            return false;
    return true;
}
void NQueens(int *arr, int i, int n)
{
    for (int j = 1; j != n + 1; ++j)
    {
        arr[i] = j;
        if (Verify(arr, i))
        {
            if (i == n)
                PrintResult(arr, n);
            else
                NQueens(arr, i + 1, n);
        }
    }
}

int main()
{
    int n;
    cin >> n;
    int *arr = new int[n&nb
sp;+ 1];
    NQueens(arr, 1, n);

    return 0;
}



相关内容
赞助商链接