题解: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;
}


posted @ 2025-07-26 18:48  WMWD  阅读(4)  评论(0)    收藏  举报