题解
2024-10-10 13:10:26
发布于:广东
30阅读
0回复
0点赞
不是你们的代码怎么那么长啊
来分享一下 解法(总共时间复杂度 )
首先创建个 的数组
具体可以看下面:(1是连接点的线段,2是点,0是空格)
2 1 2 1 2 1 2 1 2 ...
1 0 1 0 1 0 1 0 1 ...
2 1 2 1 2 1 2 1 2 ...
1 0 1 0 1 0 1 0 1 ...
2 1 2 1 2 1 2 1 2 ...
.
.
.
我们修改只需改1处就行
那么怎么判断是否形成小正方形呢?
拿添加竖着的线段为例
黑色线段是原本已经有的,红色线段是新加的
那么它用数组这么表示:
0 1 0 1 0
1 0 1 0 1
0 1 0 1 0
(最中间的1是新加的,原本是0)
我们发现只需要判断左上,左下,左两格就能判断是否在左边形成新的正方形
只需要判断右上,右下,右两格就能判断是否在右边形成新的正方形
横着的同理 自己推.
代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
bool vis[1005][1005];
int n, m, k;
int x1, y1, x2, y2;
int ct[2];
bool check1(int x, int y){
if(x == 1) return 0;
if(!vis[x - 1][y - 1] || !vis[x - 2][y] || !vis[x - 1][y + 1]) return 0;
return 1;
}
bool check2(int x, int y){
if(x == n * 2 - 1) return 0;
if(!vis[x + 1][y - 1] || !vis[x + 2][y] || !vis[x + 1][y + 1]) return 0;
return 1;
}
bool check3(int x, int y){
if(y == 1) return 0;
if(!vis[x - 1][y - 1] || !vis[x][y - 2] || !vis[x + 1][y - 1]) return 0;
return 1;
}
bool check4(int x, int y){//判断
if(y == m * 2 - 1) return 0;
if(!vis[x - 1][y + 1] || !vis[x][y + 2] || !vis[x + 1][y + 1]) return 0;
return 1;
}
int main(){
cin >> n >> m >> k;
k *= 2;
int cur = 1;
while(k--){
cur ^= 1;//交换玩家
cin >> x1 >> y1 >> x2 >> y2;
if(x1 == x2){
vis[x1 * 2 - 1][min(y1, y2) * 2] = 1;//记录
ct[cur] += check1(x1 * 2 - 1, min(y1, y2) * 2);
ct[cur] += check2(x1 * 2 - 1, min(y1, y2) * 2);
}else{
vis[min(x1, x2) * 2][y1 * 2 - 1] = 1;
ct[cur] += check3(min(x1, x2) * 2, y1 * 2 - 1);
ct[cur] += check4(min(x1, x2) * 2, y1 * 2 - 1);
}
}
cout << ct[0] << ' ' << ct[1];
return 0;
}
这里空空如也
有帮助,赞一个