问题描述
地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横、坚、斜线位置。
看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地。各皇后都有自己的势力范围,但也总能找到相安无事的办法。
所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死......
现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王在王宫的边上,占用的格子可能不到9个)。当然,皇后也不会攻击国王。
现在知道了国王的位置(x,y)(国王位于第x行第y列,x,y的起始行和列为1),请问,有多少种方案放置n个皇后,使她们不能互相攻击。
看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地。各皇后都有自己的势力范围,但也总能找到相安无事的办法。
所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死......
现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王在王宫的边上,占用的格子可能不到9个)。当然,皇后也不会攻击国王。
现在知道了国王的位置(x,y)(国王位于第x行第y列,x,y的起始行和列为1),请问,有多少种方案放置n个皇后,使她们不能互相攻击。
输入格式
一行,三个整数,皇宫的规模及表示国王的位置
输出格式
一个整数,表示放置n个皇后的方案数
样例输入
8 2 2
样例输出
10
数据规模和约定
n<=12
这一题跟n皇后一样 只不过在剪枝函数can()中增加了限定条件
#include <iostream>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
bool can(int *a ,int i ,int j ,int wx,int wy,int n)
{
for(int v = 0 ; v <n ; v++)
{
if(a[v]==j||abs(v-i)==abs(a[v]-j))
{
return 0;
}
}
if(i<wx-1||i>wx+1||j<wy-1||j>wy+1)
{
return 1;
}
return 0;
}
void queen()
{
int x = -10000;
int n;
cin >> n;
int a[n];
for(int i = 0 ; i < n ;i++)
{
a[i] = x;
}
int wx,wy;
cin >>wx>>wy;
wy -= 1;
wx -= 1;
int cnt = 0;
int j=0;
int i = 0;
while(i<n)
{
while(j<n)
{
if(can(a,i,j,wx,wy,n))
{
a[i]=j;
j=0;
/*
if(i == n-1)
{
cnt++;
j = a[i]+1;
a[i]=x;
continue;
}
*/
break;
}
else
j++;
}
if(a[i]==x)
{
if(i==0)
{
cout << cnt;
break;
}
else
{
i--;
j = a[i]+1;
a[i]=x;
continue;
}
}
if(i == n-1)
{
cnt++;
j = a[i]+1;
a[i]=x;
continue;
}
i++;
}
}
int main(int argc, const char * argv[]) {
//medicine();
//shop();
//split();
//messile();
// ball();
// LCS();
// car();
// award();
queen();
}