您的位置:首页 > 其它

8皇后问题的各种解法

2016-07-10 13:30 363 查看
总体上分为回溯和全排列

全排列(递归)

#include <iostream>
#include <algorithm>

using namespace std;

template <size_t N> struct ArraySizeHelper { char _
; };
template <typename T, size_t N> ArraySizeHelper<N> makeArraySizeHelper(T(&)
);
#define ARRAY_SIZE(a) sizeof(makeArraySizeHelper(a))

bool valid_permutation(const int *queen, int len)
{
bool valid = true;

for (int i = 0; i < len; ++i)
{
for (int j = i + 1; j < len; ++j)
{
if (queen[j] - queen[i] == j - i || queen[j] - queen[i] == i - j)
{
valid = false;
}
}
}

return valid;
}

void permutation(int *queen, int len, int idx, int &count)
{
if (idx == len)
{
if (valid_permutation(queen, len)) ++count;
}
else
{
for (int i = idx; i < len; ++i)
{
swap(queen[i], queen[idx]);
permutation(queen, len, idx + 1, count);
swap(queen[i], queen[idx]);
}
}
}

// Solved by permutation recursion.
int eightqueen_permutation_recur()
{
int queen[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
int count = 0;

permutation(queen, (int)ARRAY_SIZE(queen), 0, count);

return count;
}

int main()
{
cout << eightqueen_permutation_recur() << endl;

system("pause");
return 0;
}


回溯(递归)

#include <iostream>
#include <algorithm>

using namespace std;

template <size_t N> struct ArraySizeHelper { char _
; };
template <typename T, size_t N> ArraySizeHelper<N> makeArraySizeHelper(T(&)
);
#define ARRAY_SIZE(a) sizeof(makeArraySizeHelper(a))

bool valid_backtracking(const int *queen, int len)
{
for (int i = 0; i < len; ++i)
{
const int diff = abs(queen[i] - queen[len]);
if (diff == 0 || diff == len - i) return false;
}

return true;
}

void placequeen(int *queen, int len, int idx, int &count)
{
if (idx == len)
{
++count;
}
else
{
for (int i = 0; i < len; ++i)
{
queen[idx] = i;

if (valid_backtracking(queen, idx))
{
placequeen(queen, len, idx + 1, count);
}
}
}
}

// Solved by backtracking(DFS) recursion.
int eightqueen_backtracking_recur()
{
int queen[8];
int count = 0;

placequeen(queen, (int)ARRAY_SIZE(queen), 0, count);

return count;
}

int main()
{
cout << eightqueen_backtracking_recur() << endl;

system("pause");
return 0;
}


参考:http://www.cnblogs.com/codingmylife/archive/2012/10/04/2711839.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: