您的位置:首页 > 其它

【CodeVS】1295 N皇后

2015-06-21 22:53 246 查看
【分析】

枚举。

关键是斜线。

学过一次函数就不用担心了。

不难发现,矛盾的点在同一直线,且斜率为±1。

在斜率为1的线中,y=x+b,-n+1<=b<=n-1。

在斜率为-1的线中,y=-x+b,2<=b<=n+n-1。

按行来枚举,在维护一个保证不同列的东西。

由于数据小,本人用了状态压缩来维护......

【代码】

#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

int n,cnt;
int d,u,c;

void dfs(int y)
{
if (y==n+1) {cnt++;return;}
for (int x=1;x<=n;x++)
if (!(c&1<<x)&&!(u&1<<y-x+n)&&!(d&1<<x+y-1))
{
c|=1<<x,u|=1<<y-x+n,d|=1<<x+y-1;
dfs(y+1);
c^=1<<x,u^=1<<y-x+n,d^=1<<x+y-1;
}
}

int main(void)
{
scanf("%d",&n);
dfs(1);
printf("%d\n",cnt);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: