本篇文章的算法参考自资料n皇后问题位运算版,c++的代码参考自位运算解决八皇后问题
我所做的补充不过是将结果打印出来。
因为每一次位置都是用二进制来表示,所以打印出二进制数即标示皇后的位置。考虑到八皇后所放置的位置具有对称性,所以从头打印的所有结果与从尾打印出来的所有结果都是一样的。运行环境为win32。
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <list>
using namespace std;
#define QueenNum 8
long sum = 0;
long upperlim = (1 << QueenNum) - 1;
list<int> queenList;
void printBinary(int data)
{
int maxLength = QueenNum;
list<int> byteList;
int a = 0,b = 0;
while((a = data / 2) != 0)
{
b = data % 2;
byteList.push_front(b);
data = data / 2;
}
byteList.push_front(data % 2);
while(maxLength > byteList.size())
{
printf("0 ");
maxLength--;
}
list<int>::iterator iter = byteList.begin();
for(; iter != byteList.end(); iter++)
{
printf("%d ", *iter);
}
printf("\n");
}
int times = 0;
void printQueenList(list<int> &l)
{
printf("begin times : %d\n", ++times);
list<int>::iterator iter = l.begin();
for(;iter != l.end(); iter++)
{
printBinary(*iter);
}
printf("end\n");
}
//八皇后问题
void queenTest(int row, int ld, int rd)
{
long pos, p;
if(row != upperlim)
{
//取得所有可放置的位置
pos = upperlim & (~(row | ld | rd));
while(pos)
{
p = pos & (~pos + 1);
pos = pos - p;
queenList.push_front(p);
queenTest(row | p, (ld | p) << 1, (rd | p) >> 1);
}
}else
{
printQueenList(queenList);
sum++;
}
if(queenList.size()> 0)
{
queenList.pop_front();
}
}
int _tmain(int argc, _TCHAR* argv[])
{
queenTest(0,0,0);
printf("sum : %d", sum);
system("pause");
return 0;
}