(国王放置 ) 在 n*m 的棋盘上放置 k 个国王,

(国王放置 ) 在 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 <stdio.h>
#include <string.h>
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= ① ;
		}
		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)
		② ;
	③ ;
	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)
		④ ;
	y++;
	if (y==m)
	{
		x++;
		y=0;
	}
	if (x==n)
	return;
}
while (1);
}
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	ans=0;
	memset(hash,0,sizeof(hash));
	⑤ ;
	printf("%d\n",ans);
	return 0;
}


答案
第1空:0
第2空:hash[i][j]=hash[i][j]+1
第3空:work(x,y,tot+1)
第4空:hash[i][j]=hash[i][j]-1
第5空:work(0,0,0)

题目信息

题号:6534
题型:填空题
知识点:NOIP真题
难度:普通