问题 3861 --国王放置(完善程序)

3861: 国王放置(完善程序)★★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 189  解决: 66
[提交][状态][命题人:]

题目描述

在n*m的棋盘上放置k个国王,要求k个国王互相不攻击,有多少种不同的放置方法。

假设国王放置在第(x,y)格,国王的攻击的区域是:

(x-1,y-1), (x-1,y),(x-1,y+1),(x,y-1),(x,y+1),(x+1,y-1),(x+1,y),(x+1,y+1)。

读入三个数n,m,k,输出答案。

题目利用回溯法求解。

棋盘行标号为0~n-1,列标号为0~m-1。

#include <iostream>
using namespace std;
int n,m,k,ans;
int hash[25][25];
void work(int x,int y, int tot)
{
	int i,j;
	if(tot==k)
	{
		ans++;
		return;
	}
	do
	{
		while(hash[x][y])
		{
			y++;
			if(y==m)
			{
				x++;
				y=_____(1)_______;
			}
			if(x==n)
			return;
		}
		for(i=x-1;i<=x+1;i++)
			if(i>=0&&i<n)
				for(j=y-1;j<=y+1;j++)
					if(j>=0&&j<m)
						_____(2)______;
                _____(3)_____;
		for(i=x-1;i<=x+1;i++)			
			if(i>=0&&i<n)
				for(j=y-1;j<=y+1;j++)
					if(j>=0&&j<m)
					  hash[i][j]=0;
		_____(4)_____;
		if(y==m)
		{
			x++;
			y=0;
		}
		if(x==n)
		return;
		
	}while(1);
}
int main()
{
	cin>>n>>m>>k;
	ans=0;
	_____(5)_____;
	cout<<ans<<endl;
}


输入

输出

输出每个空的答案,大写字母,每个单独一行,一共五行

提示

来源

 

[提交][状态]