PAT 1012. Greedy Snake (35)

暴力出

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



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值