85 王、后传说
85 王、后传说
作者: turbo时间限制: 1S章节: 递归
问题描述 :
地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横、竖、斜线位置。
看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地。各皇后都有自己的势力范围,但也总能找到相安无事的办法。
所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死......
现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王位于王宫的边缘,占用的格子可能不到9个)。当然,皇后也不会攻击国王。
现在知道了皇宫的规模n,国王的位置(x,y)(国王位于第x行第y列,行和列号从1开始),请问,有多少种方案放置n个皇后,使她们不能互相攻击(同一横线、竖线、斜线上只能有一个皇后)。
输入说明 :
输入仅一行,包含三个整数,表示皇宫的规模n(n<=12)及国王的位置x和y坐标。
输出说明 :
一个整数,表示放置n个皇后的方案数
输入范例 :
8 2 2
输出范例 :
10
#include <iostream>
using namespace std;
int martix[13][13] = { 0 };
int n;
int step = 0;
bool check(int x, int y)
{
for (int i = 1; i < x; i++)//该列是否有皇后
{
if (martix[i][y] == 2)
return false;
}
for (int i = 0; i < y; i++)//行
{
if (martix[x][i] == 2)
return false;
}
int y1 = y-1, y2 = y+1;
for (int i = x - 1; i >= 1; i--)
{
if (y1 >= 1 && martix[i][y1] == 2)
return false;
else
y1--;
if (y2<=n&&martix[i][y2]==2)
return false;
else
y2++;
}
return true;
}
void dfs(int x)//index行
{
if (x == n + 1)
{
step++;
return;
}
for (int y = 1; y <= n; y++)
{
if (martix[x][y] == 1)//是否为国王
continue;
if (check(x, y))
{
martix[x][y] = 2;
dfs(x + 1);
martix[x][y] = 0;
}
}
}
int main()
{
int x, y;
cin >> n >> x >> y;
int x1, y1, x2, y2;
x1 = x2 = x; y1 = y2 = y;
if (x1 - 1 >= 1)x1--;
if (y1 - 1 >= 1)y1--;
if (x2 + 1 <= n)x2++;
if (y2 + 1 <= n)y2++;
for (int i = x1; i <= x2; i++)
{
for (int j = y1; j <= y2; j++)
{
martix[i][j] = 1;
}
}
dfs(1);
cout << step << endl;
return 0;
}
Yesterday is history,tomorrow ismystery,but today is a gift!That why it is called Present!