记录编号 |
559826 |
评测结果 |
AAAAAAAAAA |
题目名称 |
亡羊补牢,未为迟也 |
最终得分 |
100 |
用户昵称 |
fsdh |
是否通过 |
通过 |
代码语言 |
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;
}