求解n×n棋盘上未被Bishop攻击的方格数(代码待完善)
问题描述
国际象棋中的“主教(Bishop)”会攻击所有位于同一条对角线(两种方向的对角线)上的方格。Shakhriyar在n×n大小的棋盘上放置了m个主教,需统计未被攻击的方格数量。
输入:
第一行输入n(1≤n≤1e6)和m(1≤m≤1e5),后续m行输入每个主教的坐标(r[i],c[i]),所有主教位置唯一。
输出:
未被攻击的方格数。
输入示例:
10 6 4 7 8 5 8 7 6 2 9 7 8 4
输出示例:
33
我的解题进展
棋盘共有2n-1条对角线,用d表示对角线编号,(i;j)为方格坐标(y轴为i,x轴为j)。我定义了两类对角线编号规则:
- 类型1:
d = n - (i - j) - 类型2:
d = i + j - 1
我用集合记录了被攻击的两类对角线,但计算被攻击方格总数时,对角线的交点会被重复统计,这个问题还没解决。
我的C++代码:
#include<iostream> #include<set> using namespace std; int main(){ set<int> hit_diagonals1,hit_diagonals2; int n,m; cin>>n>>m; for(int k=0,i,j; k<m; k++){///O(m)-->1e5 cin>>i>>j; hit_diagonals1.insert(n-(i-j)); hit_diagonals2.insert(i+j-1); } int cnt=0;//hit_points_number //..... cout<<n*n-cnt<<'\n'; return 0; }
内容的提问来源于stack exchange,提问作者Isa
相关产品推荐
相关产品推荐

