社区讨论
同一道题 LOJ 50pts 但是 LG 0pts
P2825[HEOI2016/TJOI2016] 游戏参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo2l4xn3
- 此快照首次捕获于
- 2023/10/23 15:37 2 年前
- 此快照最后确认于
- 2023/10/23 15:37 2 年前


#include <bits/stdc++.h>
#define MP make_pair
using namespace std;
const int maxn = 205;
int n, m, x, y, ans;
bool vis[maxn * maxn];
pair <int, int> l[maxn];
vector <int> pp[maxn * maxn];
int mp[maxn][maxn], d[maxn * maxn];
int changeon(const int x, const int y) {
return (x - 1) * (m + 1) + y;
}
pair <int, int> changeoff (const int t) {
int x = (t - 1) / (m + 1) + 1;
int y = t - (x - 1) * (m + 1);
return MP (x, y);
}
bool check (int x) {
int i, y, k = pp[x].size();
for (i = 0; i < k; ++i) {
y = pp[x][i];
if (!vis[y]) {
vis[y] = 1;
if (!d[y] || check (d[y])) {
d[y] = x;
return 1;
}
}
}
return 0;
}
signed main () {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i) {
string a;
cin >> a;
for (int j = 0; j < m; ++j) {
if (a[j] == '*') mp[i][j] = 0;
else if (a[j] == 'x') mp[i][j] =1;
else mp[i][j] = 2;
}
}
for (int i = 0; i <= n + 1; ++i) mp[i][0] = mp[i][m + 1] = 2;
for (int i = 0; i <= m + 1; ++i) mp[0][i] = mp[n + 1][i] = 2;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (mp[i][j]) continue;
y = j + 1;;
while (mp[i][y] != 2) ++y;
x = i + 1;
while (mp[x][j] != 2) ++x;
pp[changeon(i, y)].push_back(changeon(x, j));
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (mp[i][j + 1] == 2) {
memset(vis, 0, sizeof (vis));
if (check(changeon(i, j + 1))) ++ans;
}
}
}
printf("%d\n", ans);
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...