题解
2026-04-11 11:15:14
发布于:湖南
5阅读
0回复
0点赞
问题分析
这是一个经典的国际象棋皇后攻击范围问题:
-皇后可以攻击同一行、同一列、两条对角线上的所有格子。
-我们需要根据输入的皇后位置,标记棋盘上的三种状态:Q(皇后位置)、#(被攻击到)、.(安全)。
-数据范围 n ≤ 100,直接暴力模拟即可,时间复杂度 O(n²),完全满足要求。
核心思路
1.初始化棋盘:创建一个 n×n 的二维数组,初始值为 .。
2.标记皇后位置:将输入的 (x,y) 位置设为 Q,同时记录被攻击的行、列、对角线。
标记攻击范围:
3.对每个皇后,遍历其所在行、列、两条对角线,将非 Q 的位置设为 #。
4.输出棋盘:按行打印最终状态。
c++代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
// 初始化棋盘,全部为 '.'
vector<vector<char>> board(n + 1, vector<char>(n + 1, '.'));
// 存储皇后位置
vector<pair<int, int>> queens;
for (int i = 0; i < m; ++i) {
int x, y;
cin >> x >> y;
board[x][y] = 'Q';
queens.emplace_back(x, y);
}
// 四个方向:上下左右、两条对角线
// 方向数组:(dx, dy)
const int dx[] = {-1, 1, 0, 0, -1, -1, 1, 1};
const int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
// 遍历每个皇后,标记攻击范围
for (auto &q : queens) {
int x = q.first;
int y = q.second;
// 8个方向延伸,直到棋盘边界
for (int d = 0; d < 8; ++d) {
int nx = x + dx[d];
int ny = y + dy[d];
while (nx >= 1 && nx <= n && ny >= 1 && ny <= n) {
if (board[nx][ny] == '.') {
board[nx][ny] = '#';
}
nx += dx[d];
ny += dy[d];
}
}
}
// 输出棋盘(1-based 转 0-based 输出)
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
cout << board[i][j];
}
cout << '\n';
}
return 0;
}
这里空空如也








有帮助,赞一个