tj小模拟
2024-10-11 19:02:54
发布于:广东
39阅读
0回复
0点赞
我简陋的代码。我这个做法o(1)中的o(1),包快的!想要教程吗?
给。
很简单,模拟两位玩家在棋盘上的操作创建一个二维数组来表示棋盘上的水平边和垂直边。
输入macw和alex的操作,给bool数组进行标记,每次操作后,检查是否有新的最小正方形形成,并计算新增的正方形数量。
输出两位玩家的得分。
虽然是小模拟,注意正方形
#include <iostream>
#define MAXN 1005
#define MAXM 1005
bool vis[MAXN][MAXM];
bool dis[MAXN][MAXM];
int solve(bool vis[][MAXM], bool dis[][MAXM], int x1, int y1, int x2, int y2, int n, int m) {
int ct= 0;
if (x1 == x2) {
if (y1 > y2) std::swap(y1, y2);
vis[x1][y1] = true;
if (x1 > 0) {
if (vis[x1-1][y1] && dis[x1-1][y1] &&dis[x1-1][y1+1]) {
ct++;
}
}
if (x1 < n - 1) {
if (vis[x1+1][y1] && dis[x1][y1] && dis[x1][y1+1]) {
ct++;
}
}
} else {
if (x1 > x2) std::swap(x1, x2);
dis[x1][y1] = true;
if (y1 > 0) {
if (dis[x1][y1-1] && vis[x1][y1-1] && vis[x1+1][y1-1]) {
ct++;
}
}
if (y1 < m - 1) {
if (dis[x1][y1+1] && vis[x1][y1] && vis[x1+1][y1]) {
ct++;
}
}
}
return ct;
}
int main() {
int n, m, q;
scanf("%d%d%d",&n,&m,&q);
for (int i = 0; i < n + 1; i++) {
for (int j = 0; j < m; j++) {
vis[i][j] = false;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m + 1; j++) {
dis[i][j] = false;
}
}
int macw = 0;
int alex = 0;
for (int i = 0; i < q; i++) {
int a, b, c, d;
scanf("%d%d%d%d",&a,&b,&c,&d);
macw += solve(vis, dis, a - 1, b - 1, c - 1, d - 1, n, m);
scanf("%d%d%d%d",&a,&b,&c,&d);
alex += solve(vis, dis, a - 1, b - 1, c - 1, d - 1, n, m);
}
printf("%d %d\n",macw,alex);
return 0;
}
全部评论 1
天啊ac君给我点赞了
2024-10-15 来自 广东
0666解法都一样 怎么不给我点
2024-11-03 来自 广东
0
有帮助,赞一个