#57. NOIP2009PJ-28

NOIP2009PJ-28

27.(完善程序)

(国王放置)在 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=_________________________;
			}
			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(){
	cin >> n >> m >> k;
	ans=0;
	memset(hash,0,sizeof(hash));
	___________________________;
	cout << ans << endl;
	return 0;
}

①:{{ input(1) }}

②:{{ input(2) }}

③:{{ input(3) }}

④:{{ input(4) }}

⑤:{{ input(5) }}