专栏文章
B. Target Practice 题解
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqz9ssb
- 此快照首次捕获于
- 2025/12/04 13:10 3 个月前
- 此快照最后确认于
- 2025/12/04 13:10 3 个月前
Problem B.Target Practice题解
简化题意
输入大小为 的字符,
X 表示这个点射中, . 表示这个点未被射中,而计分规则是从外到内的每个环分数依次为 请计算出这次射击的总分。思路1:
从外到内每一圈边界的计分方式其实可以看做:首先,对最外圈轮廓内部的所有
X 计一分,然后对此外圈内部的所有 X 计一分,以此类推。也就是说我们每次对大小为 的区间都计一分,我们发现这样的计分方式等价于第 圈边界记 分 。那么代码就很好写了,我们对于第 圈很容易计算出其包括的正方形的左上角与右下角的坐标值,按照先前所说的计分即可。
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int n=10;
int a[101][101];
signed main(){
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int T;cin>>T;
while(T--){
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=0;//注意多测要清空否则上次的结果会干扰这次
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
char c;cin>>c;
if(c=='X') a[i][j]=1;//提前转化为数字1
}
for(int circle=1;circle<=5;circle++)//一共五个正方形
for(int i=circle;i<=n-circle+1;i++)//当前正方形的起始与截止位置
for(int j=circle;j<=n-circle+1;j++)
ans+=a[i][j];//计分
cout<<ans<<"\n";
}
return 0;
}
思路2:
切比雪夫距离:一个点与原点之间的切比雪夫距离定义为其各坐标绝对值的最大值。即
以中心点为原点,每个点的切比雪夫距离如图。


那么我们将问题转化,我们将 的图转化为横纵坐标都从 到 的一张图,图中的中心点 为设置的虚点,那么每个点的贡献就是
最终统计答案即可。
代码如下:
CPPvoid Main() {
int ans = 0;
for(int i = -5;i <= 5;i ++) {
if(!i)continue;
for(int j = -5;j <= 5;j ++){
if(!j)continue;
char t;
cin>>t;
if(t=='.')continue;
ans+=6-max(abs(i),abs(j));
}
}
cout<<ans<<'\n';
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...