#include <stdio.h>
#include <stdlib.h>
#include <time.h>
long sum = 0, upperlim = 1;
void test(long row, long ld, long rd)
/*功能描述:
*参数:
* row:已经有皇后的列的位表示形式,如00010表示只有第4列有皇后
* ld:表示皇后在左斜角的影响位,不能有皇后的位置
* rd:表示皇后在右斜角的影响位,不能有皇后的位置
*/
{
if (row != upperlim)
{
/*all position postion */
long pos = upperlim & ~(row | ld | rd);
while (pos)
{
long p = pos & -pos;
pos -= p;
test(row + p, (ld + p) << 1, (rd + p) >> 1);
}
} else
sum++;
}
int main(int argc, char *argv[])
{
time_t tm;
int n = 16;
if (argc != 1)
n = atoi(argv[1]);
tm = time(0);
if ((n < 1) || (n > 32))
{
printf(" 只能计算1-32之间/n");
exit(-1);
}
printf("%d 皇后/n", n);
upperlim = (upperlim << n) - 1;