B. Target Practice 题解
unicornshjl · · 个人记录
Problem B.Target Practice题解
简化题意
输入大小为 X 表示这个点射中, . 表示这个点未被射中,而计分规则是从外到内的每个环分数依次为
思路1:
从外到内每一圈边界的计分方式其实可以看做:首先,对最外圈轮廓内部的所有 X 计一分,然后对此外圈内部的所有 X 计一分,以此类推。也就是说我们每次对大小为
那么代码就很好写了,我们对于第
#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:
切比雪夫距离:一个点与原点之间的切比雪夫距离定义为其各坐标绝对值的最大值。即
以中心点为原点,每个点的切比雪夫距离如图。
那么我们将问题转化,我们将
最终统计答案即可。
代码如下:
void 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';
}