1 条题解
-
0
自动搬运
来自洛谷,原作者为

ew3www
homework不可数说明了什么搬运于
2025-08-24 23:11:02,当前版本为作者最后更新于2025-03-15 17:43:40,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
分析
本题为大模拟,只要有耐心就能过。
其实,题目已经把绝大多数解题需要的信息告诉我们了,只需按题意模拟即可。
-
首先,找出两方国王 和 的位置,并存储进变量中。
-
然后,判断此时国王是否受对方棋子的攻击。
攻击判定方法如下:
- 判断国王的斜对角方向是否有对方的象或皇后;
- 判断国王的竖直方向及水平方向上是否有对方的车或皇后;
- 判断国王前方斜对角一格内是否有对方的兵;
- 判断国王是否受马攻击;
- 判断国王周围一圈内是否有对方的国王。
-
最后,若白方被将军,输出 ,若黑方被将军,输出 ,若没有任何一方被将军,输出 。
题目分析虽不难,但码量极大,一定要耐心的敲完!
Code
#include <bits/stdc++.h> using namespace std; bool at(int kr, int kc, bool iw, const vector<string>& b){ // 判断是否有一方被将军 // 判断此时国王是否受兵攻击 if(iw){ int r = kr - 1, c = kc - 1; if(r >= 0 && c >= 0 && b[r][c]=='p') return true; r = kr - 1, c = kc + 1; if(r >= 0 && c < 8 && b[r][c]=='p') return true; } else{ int r = kr + 1, c = kc - 1; if(r < 8 && c >= 0 && b[r][c]=='P') return true; r = kr + 1, c = kc + 1; if(r < 8 && c < 8 && b[r][c]=='P') return true; } // 判断国王此时是否受马攻击 int kn[8][2] = {{-2,-1}, {-2,1}, {-1,-2}, {-1,2}, {1,-2}, {1,2}, {2,-1}, {2,1}}; for(int i = 0; i < 8; i++){ int r = kr + kn[i][0], c = kc + kn[i][1]; if(r >= 0 && r < 8 && c >= 0 && c < 8){ char p = b[r][c]; if(iw && p=='n') return true; if(!iw && p=='N') return true; } } // 判断国王此时是否受皇后或车攻击 int ro[4][2] = {{-1,0}, {1,0}, {0,-1}, {0,1}}; for(int i = 0; i < 4; i++){ int r = kr, c = kc; while(1){ r += ro[i][0], c += ro[i][1]; if(r < 0 || r >= 8 || c < 0 || c >= 8) break; char p = b[r][c]; if(p != '.'){ if(iw && (p=='r' || p=='q')) return true; if(!iw && (p=='R' || p=='Q')) return true; break; } } } // 判断国王此时是否受皇后或象攻击 int bi[4][2] = {{-1,-1}, {-1,1}, {1,-1}, {1,1}}; for(int i = 0; i < 4; i++){ int r = kr, c = kc; while(1){ r += bi[i][0], c += bi[i][1]; if(r < 0 || r >= 8 || c < 0 || c >= 8) break; char p = b[r][c]; if(p != '.'){ if(iw && (p=='b' || p=='q')) return true; if(!iw && (p=='B' || p=='Q')) return true; break; } } } // 判断国王此时是否受另一方国王攻击 int ki[8][2] = {{-1,-1}, {-1,0}, {-1,1}, {0,-1}, {0,1}, {1,-1}, {1,0}, {1,1}}; for(int i = 0; i < 8; i++){ int r = kr + ki[i][0], c = kc + ki[i][1]; if(r >= 0 && r < 8 && c >= 0 && c < 8){ char p = b[r][c]; if(iw && p=='k') return true; if(!iw && p=='K') return true; } } return false; } string pr(const string &s){ // 解析 FEN 格式的棋局 string r = ""; for(int i = 0; i < s.size(); i++){ char ch = s[i]; if(isdigit(ch)){ int cnt = ch - '0'; r.append(cnt, '.'); } else r.push_back(ch); } return r; } int main(){ int t; cin >> t; while(t--){ string fen; cin >> fen; vector<string> p; string tk = ""; for(int i = 0; i < fen.size(); i++){ char ch = fen[i]; if(ch=='/'){ p.push_back(tk); tk = ""; } else tk.push_back(ch); } p.push_back(tk); vector<string> b(8); for(int i = 0; i < 8; i++){ b[i] = pr(p[i]); if(b[i].size() < 8) b[i].append(8 - b[i].size(), '.'); } int wr = -1, wc = -1, br = -1, bc = -1; for(int i = 0; i < 8; i++){ for(int j = 0; j < 8; j++){ if(b[i][j]=='K'){ wr = i; wc = j; } if(b[i][j]=='k'){ br = i; bc = j; } } } if(wr != -1 && at(wr, wc, true, b)) cout << "check" << "\n"; else if(br != -1 && at(br, bc, false, b)) cout << "CHECK" << "\n"; else cout << "none" << "\n"; } return 0; }珍惜生命,远离抄袭!
-
- 1
信息
- ID
- 11477
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 上传者