Codeforces Round #779 (Div. 2) E. Gojou and Matrix Game(博弈,但是思维)

Codeforces Round #779 (Div. 2) E. Gojou and Matrix Game(博弈,但是思维)

链接
题意:给出一个矩阵, n ∗ n n*n nn,其中的价值互不相等,GM两人轮流取数,每个数任意多次,但与上一个位置的曼哈顿距离不能小于等于k。M先取,对于每个位置输出在 1 0 100 10^{100} 10100步之后谁会赢。 n ≤ 2000 n\le2000 n2000
思路:首先我们可以现根据博弈论确定必胜状态,那就是最大的一定赢,然后我们根据值排序,从大到小,确定赢得局面,现在我们有不等式 ∣ i − i ′ ∣ + ∣ j − j ′ ∣ ≤ k |i-i'|+|j-j'|\le k ii+jjk也就是 m a x ( ∣ i + j ∣ − ∣ i ′ + j ′ ∣ , ∣ i − j ∣ + ∣ i ′ − j ′ ∣ ) ≤ k max(|i+j|-|i'+j'|,|i-j|+|i'-j'|)\le k max(i+ji+j,ij+ij)k所以我们记录最大的 i − j i-j ij和最小的 i + j i+j i+j来check就可以了。

#include<bits/stdc++.h>
using namespace std;
#define sf(x) scanf("%d", &x)
#define pf(x) printf("%c", x);
int f[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int mp[2020][2020];
char ans[2020][2020];
struct Node{int x, i, j, a, b;}e[10000100];
bool cmp(Node a, Node b) {return a.x > b.x;}
int u, d, l, r, k, idx;
bool check(int i, int j)
{
    return (abs(i - u) <= k && abs(i - d) <= k && abs(j - l) <= k && abs(j - r) <= k);
}


signed main()
{
    int n;
    sf(n); sf(k);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            int x;
            sf(x);
            e[++idx] = {x, i, j, j - i, i + j};
        }
    }
    sort(e + 1, e + 1 + idx, cmp);
    l = e[1].a, r = e[1].a, u = e[1].b, d = e[1].b;
    for (int i = 1; i <= idx; i++) {
        if (check(e[i].b, e[i].a)) {
            ans[e[i].i][e[i].j] = 'M';
            l = min(l, e[i].a);
            r = max(r, e[i].a);
            u = min(u, e[i].b);
            d = max(d, e[i].b);
        }else ans[e[i].i][e[i].j] = 'G';
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            pf(ans[i][j]);
        }cout << endl;
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值