#include <iostream>
#include "arithmetics.h"
using namespace std;
using ll = long long;
pair<int, int> pawn(int r, int c, int j0, int j1) {
if (j0 == j1)
return {r - 1, 1};
else
return {0, 0};
}
pair<int, int> rook(int r, int c, int j0, int j1) {
if (j0 == j1)
return {1, 1};
else
return {2, 2};
}
struct point {
ll x, y;
point(){}
point(ll x_, ll y_): x(x_), y(y_) {}
point operator/(ll t) const {
return {x / t, y / t};
}
point operator*(ll t) const {
return {x * t, y * t};
}
bool operator==(point pt) const {
return x == pt.x && y == pt.y;
}
bool operator!=(point pt) const {
return x != pt.x || y != pt.y;
}
ll operator*(point pt) const {
return x * pt.y - y * pt.x;
}
ll operator^(point pt) const {
return x * pt.x + y * pt.y;
}
point rotate_45_normal() {
point ans(x - y, x + y);
if (abs(x + y) == 2 || abs(x - y) == 2)
return ans / 2;
else
return ans;
}
point rotate_90() {
return {-y, x};
}
};
pair<int, int> queen(int r, int c, int j0, int j1) {
for (point dir(1, 0); dir != point(-1, 0); dir = dir.rotate_45_normal()) {
//cout << "! " << dir.x << ' ' << dir.y << endl;
if (dir * point(j1 - j0, r - 1) == 0)
return {1, 1};
}
int cnt = 2;
for (point dir(1, 1); dir != point(-1, -1); dir = dir.rotate_90()) {
// (j0, 0) + dir * k = (j1, y0)
ll y0 = (j1 - j0) / dir.x * dir.y;
if (0 <= y0 && y0 < r)
cnt += 2;
// (j0, 0) + dir * k = (x1, r - 1)
ll x1 = j0 + (r - 1) / dir.y * dir.x;
if (0 <= x1 && x1 < c)
++cnt;
// (x2, 0) + dir * k = (j1, r - 1)
ll x2 = j1 - (r - 1) / dir.y * dir.x;
if (0 <= x2 && x2 < c)
++cnt;
}
if ((j0 + j1 + r) % 2) {
int jright = 2 * r - j1 - 1;
if (point(jright - j0, r - 1) * point(1, 1) >= 0)
++cnt;
int jleft = -j1 - 1;
if (point(-1, 1) * point(j0 - jleft, r - 1) >= 0)
++cnt;
}
return {2, cnt};
}
pair<int, int> bishop(int r, int c, int j0, int j1) {
}
signed main() {
int r, c, q;
cin >> r >> c >> q;
while (q--) {
char t;
int j0, j1;
cin >> t >> j0 >> j1;
--j0, --j1;
pair<int, int> ans;
if (t == 'P') {
ans = pawn(r, c, j0, j1);
} else if (t == 'Q') {
ans = queen(r, c, j0, j1);
} else if (t == 'R') {
ans = rook(r, c, j0, j1);
}
cout << ans.first << ' ' << ans.second << '\n';
}
}
Compilation message
chessrush.cpp: In function 'std::pair<int, int> bishop(int, int, int, int)':
chessrush.cpp:99:1: warning: no return statement in function returning non-void [-Wreturn-type]
99 | }
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
212 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
212 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
304 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
304 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
212 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
212 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
212 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
212 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
212 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |