QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#696883 | #6677. Puzzle: Sashigane | pppwolf | WA | 1ms | 3816kb | C++20 | 8.0kb | 2024-11-01 05:00:37 | 2024-11-01 05:00:39 |
Judging History
answer
#include <bits/stdc++.h>
using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;
using i128 = __int128;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, a, b;
std::cin >> n >> a >> b;
if (n == 1) {
std::cout << "Yes\n0";
return 0;
}
int r = std::max(std::min(n - a + 1, a), std::min(n - b + 1, b));
int dx[4] = {-1, -1, 1, 1}, dy[4] = {-1, 1, 1, -1};
std::vector<std::array<int, 4>> ans;
if (a > n / 2 && b <= n / 2) {
//std::cerr << "zx\n";
int pa = n - r + 1, pb = r;
int op = 0;
for (int i = 0; i < 4; i++) {
int px = dx[i] + a, py = dy[i] + b;
if (px <= n && px >= pa && py <= pb && py >= 1) {
op = i;
break;
}
}
int nop = 0;
if (a == pa || a == n || a == 1) {
if (op == 0) {
nop = 1;
} else if (op == 1) {
nop = 0;
} else if (op == 2) {
nop = 3;
} else if (op == 3) {
nop = 2;
}
} else if (b == pb || b == n || b == 1) {
if (op == 0) {
nop = 3;
} else if (op == 1) {
nop = 2;
} else if (op == 2) {
nop = 1;
} else if (op == 3) {
nop = 0;
}
}
//std::cerr << "nop " << nop << "\n";
a += dx[op], b += dy[op];
int cnt = 1;
while (a <= n && a >= pa && b <= pb && b > 0) {
ans.push_back({a, b, -dx[op] * cnt, -dx[op] * cnt});
a += dx[op];
b += dy[op];
cnt++;
}
if (op == 0 && nop == 3) {
a += (cnt + 1) * dx[nop];
} else if (op == 0 && nop == 1) {
b += (cnt + 1) * dy[nop];
} else if (op == 1 && nop == 0) {
b += (cnt + 1) * dy[nop];
} else if (op == 1 && nop == 2) {
a += (cnt + 1) * dx[nop];
} else if (op == 2 && nop == 3) {
b += (cnt + 1) * dy[nop];
} else if (op == 2 && nop == 1) {
a += (cnt + 1) * dx[nop];
} else if (op == 3 && nop == 2) {
b += (cnt + 1) * dy[nop];
} else if (op == 3 && nop == 0) {
a += (cnt + 1) * dx[nop];
}
while (a <= n && a >= pa && b <= pb && b > 0) {
ans.push_back({a, b, -dx[nop] * cnt, -dy[nop] * cnt});
a += dx[nop];
b += dy[nop];
cnt++;
}
a = pa - 1;
b = pb + 1;
//std::cerr << a << " " << b << " " << cnt << "\n";
int nnop = 1;
while (a < pa && a >= 1 && b > pb && b <= n) {
ans.push_back({a, b, -dx[nnop] * cnt, dx[nnop] * cnt});
a += dx[nnop];
b += dy[nnop];
cnt++;
}
} else if (a > n / 2 && b > n / 2) {
//std::cerr << "yx\n";
int pa = n - r + 1, pb = n - r + 1;
int op = 0;
for (int i = 0; i < 4; i++) {
int px = dx[i] + a, py = dy[i] + b;
if (px <= n && px >= pa && py <= n && py >= pb) {
op = i;
break;
}
}
int nop = 0;
if (a == pa || a == n || a == 1) {
if (op == 0) {
nop = 1;
} else if (op == 1) {
nop = 0;
} else if (op == 2) {
nop = 3;
} else if (op == 3) {
nop = 2;
}
} else if (b == pb || b == n || b == 1) {
if (op == 0) {
nop = 3;
} else if (op == 1) {
nop = 2;
} else if (op == 2) {
nop = 1;
} else if (op == 3) {
nop = 0;
}
}
a += dx[op], b += dy[op];
int cnt = 1;
while (a <= n && a >= pa && b <= n && b >= pb) {
ans.push_back({a, b, -dx[op] * cnt, -dx[op] * cnt});
//std::cerr << a << " " << b << "\n";
a += dx[op];
b += dy[op];
cnt++;
}
if (op == 0 && nop == 3) {
a += (cnt + 1) * dx[nop];
} else if (op == 0 && nop == 1) {
b += (cnt + 1) * dy[nop];
} else if (op == 1 && nop == 0) {
b += (cnt + 1) * dy[nop];
} else if (op == 1 && nop == 2) {
a += (cnt + 1) * dx[nop];
} else if (op == 2 && nop == 3) {
b += (cnt + 1) * dy[nop];
} else if (op == 2 && nop == 1) {
a += (cnt + 1) * dx[nop];
} else if (op == 3 && nop == 2) {
b += (cnt + 1) * dy[nop];
} else if (op == 3 && nop == 0) {
a += (cnt + 1) * dx[nop];
}
while (a <= n && a >= pa && b <= n && b >= pb) {
ans.push_back({a, b, -dx[nop] * cnt, -dy[nop] * cnt});
a += dx[nop];
b += dy[nop];
cnt++;
}
a = pa - 1;
b = pb - 1;
int nnop = 0;
//std::cerr << nnop << " " << pa << " " << pb << "\n";
while (a < pa && a >= 1 && b < pb && b >= 1) {
ans.push_back({a, b, -dx[nnop] * cnt, -dx[nnop] * cnt});
a += dx[nnop];
b += dy[nnop];
cnt++;
}
} else if (a <= n / 2 && b > n / 2) {
//std::cerr << "ys\n";
int pa = r, pb = n - r + 1;
int op = 0;
for (int i = 0; i < 4; i++) {
int px = dx[i] + a, py = dy[i] + b;
if (px <= n && px >= pa && py <= n && py >= pb) {
op = i;
break;
}
}
int nop = 0;
if (a == pa || a == n || a == 1) {
if (op == 0) {
nop = 1;
} else if (op == 1) {
nop = 0;
} else if (op == 2) {
nop = 3;
} else if (op == 3) {
nop = 2;
}
} else if (b == pb || b == n || b == 1) {
if (op == 0) {
nop = 3;
} else if (op == 1) {
nop = 2;
} else if (op == 2) {
nop = 1;
} else if (op == 3) {
nop = 0;
}
}
a += dx[op], b += dy[op];
int cnt = 1;
while (a <= pa && a >= 1 && b <= n && b >= pb) {
ans.push_back({a, b, -dx[op] * cnt, -dx[op] * cnt});
a += dx[op];
b += dy[op];
cnt++;
}
if (op == 0 && nop == 3) {
a += (cnt + 1) * dx[nop];
} else if (op == 0 && nop == 1) {
b += (cnt + 1) * dy[nop];
} else if (op == 1 && nop == 0) {
b += (cnt + 1) * dy[nop];
} else if (op == 1 && nop == 2) {
a += (cnt + 1) * dx[nop];
} else if (op == 2 && nop == 3) {
b += (cnt + 1) * dy[nop];
} else if (op == 2 && nop == 1) {
a += (cnt + 1) * dx[nop];
} else if (op == 3 && nop == 2) {
b += (cnt + 1) * dy[nop];
} else if (op == 3 && nop == 0) {
a += (cnt + 1) * dx[nop];
}
while (a <= pa && a >= 1 && b <= n && b >= pb) {
ans.push_back({a, b, -dx[nop] * cnt, -dy[nop] * cnt});
a += dx[nop];
b += dy[nop];
cnt++;
}
//std::cerr << a << " " << b << " " << cnt << "\n";
a = pa + 1;
b = pb - 1;
//std::cerr << a << " " << b << " " << cnt << "\n";
int nnop = 3;
while (a > pa && a <= n && b < pb && b >= 1) {
ans.push_back({a, b, -dx[nnop] * cnt, dx[nnop] * cnt});
a += dx[nnop];
b += dy[nnop];
cnt++;
}
} else if (a <= n / 2 && b <= n / 2) {
//std::cerr << "zs\n";
int pa = r, pb = r;
int op = 0;
for (int i = 0; i < 4; i++) {
int px = dx[i] + a, py = dy[i] + b;
if (px <= n && px >= pa && py <= n && py >= pb) {
op = i;
break;
}
}
int nop = 0;
if (a == pa || a == n || a == 1) {
if (op == 0) {
nop = 1;
} else if (op == 1) {
nop = 0;
} else if (op == 2) {
nop = 3;
} else if (op == 3) {
nop = 2;
}
} else if (b == pb || b == n || b == 1) {
if (op == 0) {
nop = 3;
} else if (op == 1) {
nop = 2;
} else if (op == 2) {
nop = 1;
} else if (op == 3) {
nop = 0;
}
}
a += dx[op], b += dy[op];
int cnt = 1;
while (a <= pa && a >= 1 && b <= pb && b >= 1) {
ans.push_back({a, b, -dx[op] * cnt, -dx[op] * cnt});
a += dx[op];
b += dy[op];
cnt++;
}
if (op == 0 && nop == 3) {
a += (cnt + 1) * dx[nop];
} else if (op == 0 && nop == 1) {
b += (cnt + 1) * dy[nop];
} else if (op == 1 && nop == 0) {
b += (cnt + 1) * dy[nop];
} else if (op == 1 && nop == 2) {
a += (cnt + 1) * dx[nop];
} else if (op == 2 && nop == 3) {
b += (cnt + 1) * dy[nop];
} else if (op == 2 && nop == 1) {
a += (cnt + 1) * dx[nop];
} else if (op == 3 && nop == 2) {
b += (cnt + 1) * dy[nop];
} else if (op == 3 && nop == 0) {
a += (cnt + 1) * dx[nop];
}
while (a <= pa && a >= 1 && b <= pb && b >= 1) {
ans.push_back({a, b, -dx[nop] * cnt, -dy[nop] * cnt});
a += dx[nop];
b += dy[nop];
cnt++;
}
a = pa + 1;
b = pb + 1;
int nnop = 2;
while (a > pa && a <= n && b <= n && b > pb) {
ans.push_back({a, b, -dx[nnop] * cnt, -dx[nnop] * cnt});
a += dx[nnop];
b += dy[nnop];
cnt++;
//std::cerr << a << " " << b << " " << cnt << "\n";
}
}
std::cout << "Yes\n" << ans.size() << "\n";
for (auto [a, b, x, y] : ans) {
std::cout << a << " " << b << " " << x << " " << y << "\n";
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 3536kb
input:
5 3 4
output:
Yes 4 4 5 -1 -1 5 3 -2 2 2 2 3 3 1 1 4 4
result:
ok Correct. (1 test case)
Test #2:
score: 0
Accepted
time: 0ms
memory: 3788kb
input:
1 1 1
output:
Yes 0
result:
ok Correct. (1 test case)
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 3816kb
input:
3 2 3
output:
Yes 2 3 2 -1 -1 1 1 2 2
result:
wrong answer position (3,1) covered twice. (test case 1)