题目链接
祭第一次场切纯模拟。
众所周知纯模拟的难点在于如何快速的写出来和调试,所以这里主要列一些容易出错的点和调试和代码技巧。
BUG
- 多测不清空
- 读入
- 越界
- 马跳两格导致坐标为负数
- 做越界处理的时候和 \(n\) 取 \(\min\)
- 判断黑白棋
- 兵的方向
- 有棋子挡住时没有 break
调试
- 手搓数据
- 静态查错
- 小黄鸭查错法(拉一个队友给他解释你的代码,解释着你就发现 BUG 了(((
暴力重构
代码
- 把一些常用的操作用函数表示(例如判断黑白,判断获胜
- 简化代码(例如没必要给黑棋和白棋写单独的代码,只需要判断是否和王的颜色不同就行
- 善用
#define
(这样可以极大让代码更清晰明了并的减小代码长度和别人的阅读体验
如果您有别的 BUG、调试或代码技巧欢迎在评论区补充~
我的代码去头只有 2k 左右,压完后应该在 1k 左右,应该还算简洁吧。
CODE(已去头)
const int fx[] = {-2, -2, 2, 2, -1, -1, 1, 1};
const int fy[] = {-1, 1, -1, 1, -2, 2, -2, 2};int n = 8;
char m[26][26];void init() {f(i, n) f(j, n) m[i][j] = 0;char a;int u = 1, v = 1;while (u <= n) {sf(a);if (a == '/') con;else if (isd(a)) v += a - '0';else m[u][v] = a, v ++;if (v == 9) u ++, v = 1;}fo(i, 0, n + 1) m[0][i] = m[i][0] = m[n + 1][i] = m[i][n + 1] = 'P';
}
int d(char s) {re ('a' <= s && s <= 'z');}
bool tag;
void win(int s) {tag = true;if (s) ut("check"); else ut("CHECK");}
#define k(s) (s == 'k' || s == 'K')
#define gg(a, b) (k(b) && d(a) != d(b))
#define M(x) ((x) < 0 ? 0 : ((x) > n ? (n + 1) : (x)))void SOLVE() {char u, v;init();f(i, n) {f(j, n) {#define jlz(x) \ //因为这里判断攻击要用很多次,所以这里给他define了v = x;\if (!v) con;\if (gg(u, v)) re win(d(u));\else brk;u = m[i][j];if (!u || k(u)) con;if (u == 'r' || u == 'R') {f(k, n) {jlz(m[i - k][j]);}f(k, n) {jlz(m[i + k][j]);}f(k, n) {jlz(m[i][j - k]);}f(k, n) {jlz(m[i][j + k]);}}else if (u == 'P' || u == 'p') {if (d(u)) {if (gg(u, m[i + 1][j - 1])) re win(d(u));if (gg(u, m[i + 1][j + 1])) re win(d(u));}else {if (gg(u, m[i - 1][j - 1])) re win(d(u));if (gg(u, m[i - 1][j + 1])) re win(d(u));}}else if (u == 'B' || u == 'b') {f(k, n) {jlz(m[i - k][j - k]);}f(k, n) {jlz(m[i - k][j + k]);}f(k, n) {jlz(m[i + k][j - k]);}f(k, n) {jlz(m[i + k][j + k]);}}else if (u == 'Q' || u == 'q') { //直接粘的车和象(最好是写个define,不过这里懒了f(k, n) {jlz(m[i - k][j]);}f(k, n) {jlz(m[i + k][j]);}f(k, n) {jlz(m[i][j - k]);}f(k, n) {jlz(m[i][j + k]);}f(k, n) {jlz(m[i - k][j - k]);}f(k, n) {jlz(m[i - k][j + k]);}f(k, n) {jlz(m[i + k][j - k]);}f(k, n) {jlz(m[i + k][j + k]);}}else if (u == 'N' || u == 'n') {fo(k, 0, 7) {v = m[M(i + fx[k])][M(j + fy[k])];if (gg(u, v)) re win(d(u));}}}}
}
signed main() {int T; sf(T);while (T --) {tag = false;SOLVE();if (!tag) ut("none");}
}