如下代码只能用g++编译,gcc不能编译。
每一行只能放一个皇后的约束条件:
1.同列两个皇后【if(甲皇后所在列==乙皇后所在列)返回 0;】
2.主对角线两个皇后【if((甲皇后所在行+列)==(乙皇后所在行+列))返回 0;】
3.副对角线两个皇后【if((甲皇后所在行-列)==(乙皇后所在行-列))返回 0;】
4.合并1. 2.条件为【if 绝对值(甲皇后所在行-乙皇后所在行)== 绝对值(甲皇后所在列-乙皇后所在列)返回 0;】
直观八皇后问题解之一如下图:
#include<iostream>
using namespace std;
static int chessboardQueen[8] = { 0 }, nCount = 0;
// nCount for counting all solutions
// chessboardQueen[] 这个数组来每行储存皇后的位置
// 比如chessboardQueen[3] =5,第四行在第六这个位置是皇后
void print()//输出每一种情况下棋盘中皇后的摆放情况
{
for (int i = 0; i < 8; i++)
{
int inner;
for (inner = 0; inner < chessboardQueen[i]; ++inner)
cout << "0"; // 0 for empty position
cout << "*"; // * for queen's position
for (inner = chessboardQueen[i] + 1; inner < 8; ++inner)
cout << "0";
cout << endl; // change to next line
}
cout << "==========================\n";
}
/*Insure no two queens share the same row, column, or diagonal
*/
int iSafePosition(int loop, int value)
{
int index;
int data;
for (index = 0; index < loop; ++index)
{
data = chessboardQueen[index];
// 同一列有两个皇后
if (value == data)
return 0;
//主对角线有两个皇后
if ((index + data) == (loop + value))
return 0;
//副对角线有两个皇后
if ((index - data) == (loop - value))
return 0;
}
return 1;
}
void eightQueen(int index)
{
int loop;
for (loop = 0; loop < 8; ++loop) //++loop的效率比loop++效率高
{
if (iSafePosition(index, loop))
{
chessboardQueen[index] = loop;
if (7 == index) // 如果index等于7则说明已经成功从第一行遍历到第八行了
{
nCount++, print(); // 计数并输出这种情形
chessboardQueen[index] = 0;
return;
}
eightQueen(index + 1); // 递归调用
chessboardQueen[index] = 0; // 下一行的第一列开始寻找
}
}
}
int main()
{
eightQueen(0); //先从第一行摆放皇后
cout << "total=" << nCount << endl;
getchar(); // 解决vs运行成功一闪而过
return 0;
}