#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) }}