Codeforces Round #779 (Div. 2) E. Gojou and Matrix Game(博弈,但是思维)
链接
题意:给出一个矩阵,
n
∗
n
n*n
n∗n,其中的价值互不相等,GM两人轮流取数,每个数任意多次,但与上一个位置的曼哈顿距离不能小于等于k。M先取,对于每个位置输出在
1
0
100
10^{100}
10100步之后谁会赢。
n
≤
2000
n\le2000
n≤2000。
思路:首先我们可以现根据博弈论确定必胜状态,那就是最大的一定赢,然后我们根据值排序,从大到小,确定赢得局面,现在我们有不等式
∣
i
−
i
′
∣
+
∣
j
−
j
′
∣
≤
k
|i-i'|+|j-j'|\le k
∣i−i′∣+∣j−j′∣≤k也就是
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+j∣−∣i′+j′∣,∣i−j∣+∣i′−j′∣)≤k所以我们记录最大的
i
−
j
i-j
i−j和最小的
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;
}