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;
}
posted @ 2020-05-12 20:12  RabbitJwr  阅读(249)  评论(0编辑  收藏  举报