暴力出
#include<iostream>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;
int N, K, a, b;
const int inf = 0x3f3f3f3f;
int dr[4] = { 0,0,1,-1 };
int dl[4] = { 1,-1,0,0 };
int T[20][20];//0代表障碍,1代表水果
bool place(int x, int y) { return (x > 0 && x <= N && y > 0 && y <= N); }
int _min, ans1_min = inf - 1, ans1_num,ans2_min=inf-1,ans2_num,x;
void dfs(int r, int l, int t, int dir) {
int nr = r + dr[dir], nl = l + dl[dir], n = 0;
if (T[nr][nl])
T[nr][nl] = 0, dfs(nr, nl, t - 1, dir), T[nr][nl] = 1, ++n;
else {
dir ^= 2; nr = r + dr[dir], nl = l + dl[dir];
if (T[nr][nl]) T[nr][nl] = 0, dfs(nr, nl, t - 1, dir), T[nr][nl] = 1, ++n;
dir ^= 1; nr = r + dr[dir], nl = l + dl[dir];
if (T[nr][nl]) T[nr][nl] = 0, dfs(nr, nl, t - 1, dir), T[nr][nl] = 1, ++n;
}
if (!n) {
if (_min > t) _min = t;
}
}
int _ok(int num) {
int ans1min = inf-1;
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= N; ++j)
if (T[i][j]) {
T[i][j] = 0, _min = inf;
for (int k = 0; k < 4; ++k)
if (T[i + dr[k]][j + dl[k]])
dfs(i, j, num - 1, k);
T[i][j] = 1;
if (ans1min > _min) ans1_num = 1, ans1min = _min;
else if (ans1min == _min) ++ans1_num;
}
return ans1min;
}
int main() {
#ifdef _DEBUG
freopen("in", "r", stdin);
#endif // _DEBUG
scanf("%d %d", &N, &K); int num = (N - 2)*(N - 2) - K;
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= N; ++j)
T[i][j] = (i == 1 || i == N || j == N || j == 1) ? 0 : 1;
while (K--)
scanf("%d %d", &a, &b), T[a][b] = 0;
ans2_min=ans1_min=_ok(num);
printf("%d %d\n", ans1_min, ans1_num);
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= N; ++j)
if (T[i][j]) {
T[i][j] = 0; x = _ok(num-1);
if (x < ans2_min)
ans2_min = x, ans2_num = 1;
else if (x == ans2_min)
++ans2_num;
T[i][j] = 1;
}
if (ans2_min == ans1_min) printf("-1\n");
else printf("%d %d\n", ans2_min, ans2_num);
}