题解:B3980 [信息与未来 2024] 间谍卫星
思路:
本题有两种做法,第一种利用周长求边长,第二种利用面积求边长。
周长法:
只需要把原图中的 \(1\) 的个数除以 \(4\) 就是边长。因为此图形的外围全是 \(1\),并且正方形边长公式是周长除以 \(4\)。记得向下取整。用字符串。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int main(){
cin.tie(0);
cin>>n;
for(int k=1;k<=n;k++){
int ans=0;
for(int i=0;i<128;i++){
cin>>s;
for(int j=0;j<128;j++){
if(s[j]=='1') ans++;
}
}
cout<<floor(ans/4.0)<<endl;
}
return 0;
}
面积法:
洪水填充法,把能搜到的 \(0\) 全标称 \(1\),搜完后数出剩余 \(0\) 的个数,这是图形的面积。再根据面积求边长。
填充时可以用深度优先搜索。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,dx[]={1,-1,0,0},dy[]={0,0,1,-1};
string s[150];
void dfs(int i,int j){
if(i<0||i>127||j<0||j>127||s[i][j]!='0') return ;
s[i][j]='1';
for(int k=0;k<=3;k++){
dfs(i+dx[k],j+dy[k]);
}
}
int main(){
cin>>n;
for(int k=1;k<=n;k++){
int ans=0;
for(int i=0;i<128;i++){
cin>>s[i];
}
dfs(0,0);
for(int i=0;i<=127;i++){
for(int j=0;j<=127;j++){
if(s[i][j]=='0') ans++;
//cout<<s[i][j];
}
//cout<<endl;
}
cout<<floor(sqrt(double(ans)))<<endl;
}
return 0;
}

浙公网安备 33010602011771号