题库 信息学奥赛题库 题目列表 NOIP2009年普及组完善程序题:(国王放置) 在n*m...
填空题

NOIP2009年普及组完善程序题:(国王放置) 在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>
usingnamespacestd;
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;
    return0;
}
题目信息
完善程序 2009年 初赛
-
正确率
0
评论
239
点击