记录编号 559826 评测结果 AAAAAAAAAA
题目名称 亡羊补牢,未为迟也 最终得分 100
用户昵称 Gravatarfsdh 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2021-03-24 20:00:10 内存使用 0.00 MiB
显示代码纯文本
#include <bits/stdc++.h> 
using namespace std;
const int MAXN = 21;
int n, m, sum = 0, vis[MAXN][MAXN], cnt[MAXN * MAXN + 1], minnum, dx[9] = {0, 1, 1, 2, 2, -1, -1, -2, -2}, dy[9] = {0, 2, -2, 1, -1, 2, -2, 1, -1};

void dfs (int x, int y, int num) {
    if (num > minnum) return ;
    if (x > n) {
        if (sum == n * m) {
            cnt[num] ++;
            if (minnum > num) minnum = num;
        }
        return ;
    }
    int xx, yy;
    for (int q = 0; q < 9; ++q) {
        xx = x + dx[q], yy = y + dy[q];
        if (xx < 1 || xx > n || yy < 1 || yy > m) continue;
        if (vis[xx][yy] == 0) {
            sum ++;
        }
        vis[xx][yy] ++;
    }
    if (y != m) {
        dfs (x, y + 1, num + 1);
    }
    else dfs (x + 1, 1, num + 1);
    for (int q = 0; q < 9; ++q) {
        xx = x + dx[q], yy = y + dy[q];
        if (xx < 1 || xx > n || yy < 1 || yy > m) continue;
        vis[xx][yy] --;
        if (vis[xx][yy] == 0) {
            sum --;
        }
    }
    if (y != m) {
        dfs (x, y + 1, num);
    }
    else dfs (x + 1, 1, num);
    return ;
}

int main () {
    memset (cnt, 0 , sizeof (cnt));
    memset (vis ,0, sizeof (vis));
    freopen ("secretnum.in", "r", stdin);
    freopen ("secretnum.out", "w", stdout);
    scanf ("%d%d", &n, &m);
    minnum = n * m + 1;
    dfs (1, 1, 0);
    printf ("%d %d\n", minnum, cnt[minnum]);
    return 0;
}