1. 程式人生 > >涵先森的創作園地

涵先森的創作園地

本演算法採用遞歸回溯的思想:

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

const int N = 8;
long count = 0; // 計數

void print(int * mapping)
{
    for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < N; ++j)
        {
            if(j == mapping[i])
                cout << "1";
            else
                cout << "0";
        }
        cout << endl;
    }
    cout << endl;
}

// 判斷該位置是否可以放置
bool isokay(int * mapping, int i, int j)
{
    for(int k = 0; k < i; ++k)  // 依次遍歷之前已經擺好的位置,是否與將要擺放的位置有衝突
    {
        if(abs(j - mapping[k]) == i - k || j == mapping[k])
            return false;
    }
    return true;
}

void solution(int * mapping, int i)
{
    for(int j = 0; j < N; ++j)  // 遍歷每一列
    {
        if(i >= N)  // 當第八列完成放置後
        {
            print(mapping);
            ++count;
            return;
        }
        if(isokay(mapping, i, j))
        {
            mapping[i] = j;
            solution(mapping, i + 1);
        }
    }
}

int main()
{
    int mapping[N] = {0};   // 定義長度為8的陣列存放擺放位置
    solution(mapping, 0);
    cout << "count:" << count;
    return 0;
}