AcWing 5590. 沿栅栏散步
原题链接
简单
作者:
懒惰的蚩蚩
,
2024-11-01 21:09:52
,
所有人可见
,
阅读 12
模拟
最重要的是,将栅栏处理成从1开始点数就可以了,如果实在不明白可以输出一下我处理之后的栅栏。
1 8 7
2 0 6
3 4 5
因为是一个闭环,所以只有两条路可以走。
分别计算一下,两条路的最短距离就可以了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 15, M = 2e5 + 15;
typedef pair<int, int> PII;
int g[N][N];
PII lan[M];
int idx = 1;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, p, x1, y1, x2, y2;
cin >> n >> p;
for(int i = 1; i <= p; i++) {
cin >> x1 >> y1;
lan[i] = {x1, y1};
}
for(int i = 2; i <= p; i++) {
int a1 = lan[i - 1].first;
int b1 = lan[i - 1].second;
int a2 = lan[i].first;
int b2 = lan[i].second;
if(a1 != a2 && b1 == b2) {
if(a1 < a2) {
for(int i = a1; i <= a2; i++) {
if(g[i][b1] == 0) g[i][b1] = idx++;
}
}else if(a1 > a2) {
for(int i = a1; i >= a2; i--) {
if(g[i][b1] == 0) g[i][b1] = idx++;
}
}
}else if(a1 == a2 && b1 != b2) {
if(b1 < b2) {
for(int i = b1; i <= b2; i++) {
if(g[a1][i] == 0) g[a1][i] = idx++;
}
}else if(b1 > b2) {
for(int i = b1; i >= b2; i--) {
if(g[a1][i] == 0) g[a1][i] = idx++;
}
}
}
}
int a1 = lan[p].first;
int b1 = lan[p].second;
int a2 = lan[1].first;
int b2 = lan[1].second;
if(a1 != a2 && b1 == b2) {
if(a1 < a2) {
for(int i = a1; i <= a2; i++) {
if(g[i][b1] == 0) g[i][b1] = idx++;
}
}else if(a1 > a2) {
for(int i = a1; i >= a2; i--) {
if(g[i][b1] == 0) g[i][b1] = idx++;
}
}
}else if(a1 == a2 && b1 != b2) {
if(b1 < b2) {
for(int i = b1; i <= b2; i++) {
if(g[a1][i] == 0) g[a1][i] = idx++;
}
}else if(b1 > b2) {
for(int i = b1; i >= b2; i--) {
if(g[a1][i] == 0) g[a1][i] = idx++;
}
}
}
//表示一共有多少个点可以走
int sum = idx - 1;
// cout << sum << endl;
while(n--) {
cin >> x1 >> y1 >> x2 >> y2;
//因为是一个闭环,所以只有两条路可以走。
//分别计算一下,两条路的最短距离就可以了。
int ft = (g[x2][y2] - g[x1][y1] + sum) % sum;
int ans = min(ft, sum - ft);
cout << ans << endl;
}
// for(int i = 0; i <= 2; i++) {
// for(int j = 0; j <= 2; j++) {
// cout << g[i][j] << " ";
// }
// cout << endl;
// }
return 0;
}