#NOIP2009J1Q36. [NOIP 2009 普及组初赛] 第 36 题

[NOIP 2009 普及组初赛] 第 36 题

(国王放置)

在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[5][5];
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)
						【第4空】;
		y++;
		if(y==m)
		{
			x++;
			y=0;
		}
		if(x==n)
			return;
	}
	while (1);
}
int main()
{
	cin >> n >> m >> k;
	ans=0;
	memset(hash,0,sizeof(hash));
	【第5空】;
	cout << ans << endl;
	return 0;
}

请填写【第5空】。

{{ input(1) }}