UVa Problem 10196 Check the Check (将军)

本文介绍了一个用于检测国际象棋中是否存在将军局面的算法。该算法通过遍历棋盘上的每个位置,并针对每种棋子(包括卒、马、象、车、后)检查其是否威胁到对方的王来实现。文章提供了完整的C++源代码,适用于初学者学习如何结合条件判断与循环控制解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// Check the Check (将军) // PC/UVa IDs: 110107/10196, Popularity: B, Success rate: average Level: 1 // Verdict: Accepted // Submission Date: 2011-05-22 // UVa Run Time: 0.008s // // 版权所有(C)2011,邱秋。metaphysis # yeah dot net #include <iostream> #include <cstdlib> using namespace std; char status[8][8]; // 表示国际象棋棋子的位置。 // 检查坐标为(kingX,kingY)的王是否在坐标为(x,y)的卒攻击范围内,注意进攻方向的不同。 bool checkP (int x, int y, int kingX, int kingY) { return (x - kingX) == 1 && abs(y - kingY) == 1; } // 检查坐标为(kingX,kingY)的王是否在坐标为(x,y)的马攻击范围内。 bool checkN (int x, int y, int kingX, int kingY) { return (abs(x - kingX) == 2 && abs(y - kingY) == 1) || (abs(x - kingX) == 1 && abs(y - kingY) == 2); } // 检查坐标为(kingX,kingY)的王是否在坐标为(x,y)的象攻击范围内。 bool checkB (int x, int y, int kingX, int kingY) { int step, currentX = x, currentY = y, directX, directY; bool checked = false; // 检查象与王是否处于对角线。 if (abs(x - kingX) == abs(y - kingY)) { checked = true; // 判断相对方位。 directX = (x < kingX) ? 1 : -1; directY = (y < kingY) ? 1 : -1; // 是否有棋子相隔。 step = abs (x - kingX); while (step > 1) { currentX += directX; currentY += directY; if (status[currentX][currentY] != '.') { checked = false; break; } step--; } } return checked; } // 检查坐标为(kingX,kingY)的王是否在坐标为(x,y)的车攻击范围内。 bool checkR (int x, int y, int kingX, int kingY) { int step, currentX = x, currentY = y, directX = 0, directY = 0; bool checked = false; // 车与王是否在同一行或者同一列,车与王之间是否有棋子相隔。 if (x == kingX || y == kingY) { checked = true; // 判断相对方位。 directX = (x == kingX) ? (0) : (x < kingX ? 1 : -1); directY = (y == kingY) ? (0) : (y < kingY ? 1 : -1); // 是否有棋子相隔。 step = (directX == 0) ? abs(y - kingY) : abs(x - kingX); while (step > 1) { currentX += directX; currentY += directY; if (status[currentX][currentY] != '.') { checked = false; break; } step--; } } return checked; } // 检查坐标为(kingX,kingY)的王是否在坐标为(x,y)的王后攻击范围内。 bool checkQ (int x, int y, int kingX, int kingY) { return checkR(x, y, kingX, kingY) || checkB(x, y, kingX, kingY); } // 检查给定棋盘状态是否存在将军局面。 void check (int gameCount) { bool bChecked = false, wChecked = false; int bKingX = -1, bKingY = -1, wKingX = -1, wKingY = -1; int directX = 0, directY = 0, currentX = 0, currentY = 0, step = 0; // 查找白棋和黑棋王的位置。 for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) { if (status[i][j] == 'k') { bKingX = i; bKingY = j; } if (status[i][j] == 'K') { wKingX = i; wKingY = j; } } // 假如未找到王的坐标,表明为空棋盘。 if (bKingX == -1) return; cout << "Game #" << gameCount << ": "; // 检查棋子与王的是否存在将军情况。 for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) { switch (status[i][j]) { // 黑卒。 case 'p': wChecked = checkP(wKingX, wKingY, i, j); break; // 白卒。 case 'P': bChecked = checkP(i, j, bKingX, bKingY); break; // 黑马。 case 'n': wChecked = checkN(i, j, wKingX, wKingY); break; // 白马。 case 'N': bChecked = checkN(i, j, bKingX, bKingY); break; // 黑象。 case 'b': wChecked = checkB(i, j, wKingX, wKingY); break; // 白象。 case 'B': bChecked = checkB(i, j, bKingX, bKingY); break; // 黑车。 case 'r': wChecked = checkR(i, j, wKingX, wKingY); break; // 白车。 case 'R': bChecked = checkR(i, j, bKingX, bKingY); break; // 黑后。 case 'q': wChecked = checkQ(i, j, wKingX, wKingY); break; // 白后。 case 'Q': bChecked = checkQ(i, j, bKingX, bKingY); break; // 其他情况。 default: break; } // 检查将军情况是否存在。 if (bChecked) { cout << "black king is in check." << endl; return; } if (wChecked) { cout << "white king is in check." << endl; return; } } cout << "no king is in check." << endl; } int main (int ac, char *av[]) { string line; int gameCount = 1, temp = 0; while (getline(cin, line)) { if (line != "") { for (int i = 0; i < 8; i++) status[temp][i] = line[i]; temp++; } else { check(gameCount); gameCount++; temp = 0; } } return 0; }

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值