记录编号 204230 评测结果 AAAAAAAAAA
题目名称 N皇后问题 最终得分 100
用户昵称 GravatarSkyo 是否通过 通过
代码语言 C++ 运行时间 0.011 s
提交时间 2015-11-04 07:07:10 内存使用 0.29 MiB
显示代码纯文本
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

int n, ans;
bool vis[105];

int Dis(int x, int y, int a, int b)
{
	return abs(x-a)+abs(y-b);
}

int id(int x, int y, int k)
{
	if(k == 1) return x;
	if(k == 2) return n+y;
	if(k == 3) return n*2+Dis(x, y, 1, n)+1;
	if(k == 4) return n*4-1+Dis(x, y, 1, 1)+1;
}

bool visited(int x, int y)
{
	return vis[id(x, y, 1)] || vis[id(x, y, 2)] || vis[id(x, y, 3)] || vis[id(x, y, 4)];
}

void setting(int x, int y, bool c)
{
	vis[id(x, y, 2)] = vis[id(x, y, 3)] = vis[id(x, y, 4)] = c;
}

void dfs(int now)
{
	if(now > n) {ans++; return ;}
	for(int i = 1; i <= n; i++) if(!visited(now, i))
	{
		setting(now, i, 1); dfs(now+1); setting(now, i, 0);
	} 
}

int main()
{
    freopen("queen.in","r",stdin); 
    freopen("queen.out","w",stdout);
	scanf("%d", &n);
	dfs(1);
	printf("%d", ans);
	return 0;
}