将军抽车 - 中国象棋问题求解
"将军抽车"是中国象棋中常用的进攻策略。如下图所示,此时红帅在 (1, 5),红车在 (2, 8)。若黑马跳到红框位置所指的 (3, 6),帅将由于被将军被迫移动,此时,马就可以吃掉红车。\n\n[图片描述:棋盘上的红帅、红车和黑马,黑马跳到 (3, 6) 位置将军红帅并攻击红车] \n\n本题将解决将军抽车的简化版问题。在本题中,将军抽车就是要通过一步跳马,在能够将军的同时将车置于马的攻击位置。\n\n只考虑棋盘上有红帅、红车、黑马各一枚的情况,不考虑帅是否可以通过移动实现对车的保护,不考虑别马腿,在当前局面,轮到黑棋移动时,黑马是否可以通过一步移动,在不出界的情况下,实现将军抽车?\n\n输入格式\n输入共三行。\n\n输入的第一行为两个整数 Sx, Sy,表示红帅的位置为 (Sx, Sy)。\n\n输入的第二行为两个整数 Cx, Cy,表示红车的位置为 (Cx, Cy)。\n\n输入的第三行为两个整数 Mx, My,表示黑马的位置为 (Mx, My)。\n\n保证红帅在 1∼3 行的九宫格内。\n\n输出格式\n输出一行一个字符串:\n\n若可以实现将军抽车,输出 Yes。\n若不可以实现将军抽车,输出 No。\n\n输入输出样例\n输入 #1\n\n1 5\n2 8\n5 5\n\n输出 #1\n\nYes\n\n输入 #2\n\n1 5\n2 9\n5 5\n\n输出 #2\n\nNo\n\n用C++做内容:\ncpp\n#include <iostream>\nusing namespace std;\n\nint main() {\n int sx, sy, cx, cy, mx, my;\n cin >> sx >> sy >> cx >> cy >> mx >> my;\n\n // 检查马的八个位置是否有一个能够将军抽车\n int dx[] = {-2, -2, -1, -1, 1, 1, 2, 2};\n int dy[] = {1, -1, 2, -2, 2, -2, 1, -1};\n for (int i = 0; i < 8; i++) {\n int nx = mx + dx[i];\n int ny = my + dy[i];\n // 如果马的移动位置等于红帅的位置,且红车的位置等于马的攻击位置之一,则可以将军抽车\n if (nx == sx && ny == sy && (cx == mx + dx[i] / 2) && (cy == my + dy[i] / 2)) {\n cout << \"Yes\" << endl;\n return 0;\n }\n }\n\n cout << \"No\" << endl;\n return 0;\n}\n
原文地址: https://www.cveoy.top/t/topic/qhWG 著作权归作者所有。请勿转载和采集!