8皇后问题:要在8×8的国际象棋棋盘中放8个皇后,使任意两个皇后都不能相互吃掉。规则是皇后能吃同一行同一列同一对角线的任意棋子。求所有的解。
8皇后问题推广:要在n×n的国际象棋棋盘中放n个皇后,使任意两个皇后都不能相互吃掉。规则是皇后能吃同一行同一列同一对角线的任意棋子。求所有的解。
感觉这就是在玩数独啊。
这是一道经典的回溯算法题
网上有各种语言 很多例子
http://blog.csdn.net/u014082714/article/details/44901575
http://blog.csdn.net/a304672343/article/details/8029122
for (i[1] = 0; i[1] < 8; i[1]++)
{
for (i[2] = 0; i[2] < 8; i[2]++)
{
for (i[3] = 0; i[3] < 8; i[3]++)
{
for (i[4] = 0; i[4] < 8; i[4]++)
{
for (i[5] = 0; i[5] < 8; i[5]++)
{
for (i[6] = 0; i[6] < 8; i[6]++)
{
for (i[7] = 0; i[7] < 8; i[7]++)
{
for (i[8] = 0; i[8] < 8; i[8]++)
{
//先假设这个组合是成功的,然后试图推翻
Boolean flag = true;
//注意课程中这个双循环嵌套的编程逻辑是如何演变而来的
for (int m = 1; m < 8; m++)
{
if (flag == false) { break; }//这一句在这里很重要,如果没有他,程序可能会多做几十倍的工作
for (int n = m + 1; n <= 8; n++)
{
if (i[m] == i[n] || Math.Abs(i[m] - i[n]) == n - m) { flag = false; break; } //这一句可以减少程序50%以上的工作量
}
}
}
#include<iostream>
using namespace std;
static int gEightQueen[8] = { 0 }, gCount = 0;
void print()//输出每一种情况下棋盘中皇后的摆放情况
{
for (int i = 0; i < 8; i++)
{
int inner;
for (inner = 0; inner < gEightQueen[i]; inner++)
cout << "0";
for (inner = gEightQueen[i] + 1; inner < 8; inner++)
cout << "";
cout << "#" << endl;
}
cout << "==========================\n";
}
int check_pos_valid(int loop, int value)//检查是否存在有多个皇后在同一行/列/对角线的情况
{
int index;
int data;
for (index = 0; index < loop; index++)
{
data = gEightQueen[index];
if (value == data)
return 0;
if ((index + data) == (loop + value))
return 0;
if ((index - data) == (loop - value))
return 0;
}
return 1;
}
void eight_queen(int index)
{
int loop;
for (loop = 0; loop < 8; loop++)
{
if (check_pos_valid(index, loop))
{
gEightQueen[index] = loop;
if (7 == index)
{
gCount++, print();
gEightQueen[index] = 0;
return;
}
eight_queen(index + 1);
gEightQueen[index] = 0;
}
}
}
void main(int argc, char*argv[])
{
eight_queen(0);
cout << "total=" << gCount << endl;
system("pause");
}