您的位置:首页 > 其它

九度OJ 1254:N皇后问题 (N皇后问题、递归、回溯)

2015-11-14 14:30 441 查看
时间限制:1 秒

内存限制:128 兆

特殊判题:否

提交:765

解决:218

题目描述:

N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。



你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。

输入:

输入包含多组测试数据。

每组测试数据输入一个整数n(3<n<=13),表示有n*n的棋盘,总共摆放n个皇后。

输出:

对于每组测试数据,输出总共不同的摆放情况个数,结果单独一行。

样例输入:
4


样例输出:
2


思路:

N皇后问题的常规解法是试探回溯法,能够给出所有解。如果只要得到一个解就行,那么还有随机解法。

相比常规解法,更高效的是位运算解法。

两者的详细介绍见我的另一篇文章《N皇后问题算法》。

代码:

#include <stdio.h>

int n, allPlacedState, count;

void queen(int row, int ld, int rd)
{
if (row != allPlacedState)
{
int pos = allPlacedState & ~(row | ld | rd);
while (pos)
{
int p = pos & -pos;
pos -= p;
queen(row+p, (ld+p)<<1, (rd+p)>>1);
}
}
else
{
count ++;
}
}

int main()
{
while (scanf("%d", &n) != EOF)
{
allPlacedState = (1<<n)-1;
count = 0;
queen(0, 0, 0);
printf("%d\n", count);
}
return 0;
}
/**************************************************************
Problem: 1254
User: liangrx06
Language: C
Result: Accepted
Time:90 ms
Memory:912 kb
****************************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: