【深搜】纯洁的皇后

题目:纯洁的皇后 rqnoj672

题目描述

当年弱弱的ALEJ刚学会pascal的时候,HSW已叱咤机房很久了。有一天,ALEJ小朋友怀着一颗CJ的稚嫩心灵向HSW请教八皇后的问题。
ALEJ:“八皇后怎样解啊,HSW?”
HSW:“嘿嘿嘿,八皇后可以扩展为N皇后呢,嘿嘿嘿”
ALEJ:“那N皇后怎么解呢,HSW?”
HSW:“嘿嘿嘿……嘿嘿嘿……嘿嘿嘿嘿……嘿嘿嘿嘿嘿……嘿嘿嘿……嘿……嘿嘿嘿……嘿嘿嘿……嘿嘿嘿……嘿嘿,看我的Wsing Dance!”
“Wsing Dance是什么算法?”ALEJ正想着,突然HSW变成了N个,并且其中一部分开始跳起了Wsing Dance。由于HSW的分身太多了,再加上耳边缠绕着的“嘿嘿”声,纯洁的ALEJ也看得头晕目眩。

ALEJ发现只有两个HSW在一行,一列,或一条对角线上时,两个HSW才会跳起舞来,而机房俯视图正好是一个N行N列的棋盘,ALEJ必须尽快移动HSW们(每个格子里只能有一个HSW),使他们不再跳Wsing Dance。ALEJ连N皇后都不会解,这下得请聪明而又纯洁的你来帮忙求出所有可能方案数了~

【数据规模】
N<=13

输入格式

输入文件仅包括一行一个正整数,N。

输出格式

输出文件包括一行一个正整数,表示所有可能的方案数。

样例输入

样例输出

 

相信大家看了题都应该知道是N皇后的翻版了吧

话不多说,Pascal Code就看N皇后的那道题http://www.cnblogs.com/oijzh/archive/2012/08/18/2645665.html

这里提供C++ Code

#include<cstdio>

int n,ans;
bool h[20],lie[20],ys[50],zs[100];

void dfs(int i)
{
  if(i>n){ans++;return;}
  for(int j=1;j<=n;j++)
    if(!h[i] && !lie[j] && !ys[i+j] && !zs[i-j+40])//[i-j+40]保证下标不为负数 
    {
      h[i]=true;lie[j]=true;ys[i+j]=true;zs[i-j+40]=true;
      dfs(i+1);
      h[i]=false;lie[j]=false;ys[i+j]=false;zs[i-j+40]=false;
    }
}

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

 

 

posted @ 2012-08-18 17:47  jiangzh  阅读(274)  评论(0编辑  收藏  举报