QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#696884 | #6677. Puzzle: Sashigane | pppwolf | WA | 0ms | 3564kb | C++20 | 8.0kb | 2024-11-01 05:04:50 | 2024-11-01 05:04:51 |
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;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3564kb
input:
5 3 4
output:
Yes 4 4 5 1 1 5 3 -2 2 2 2 3 3 1 1 4 4
result:
wrong answer L shape #1 out of bounds. (test case 1)