2021-03-08第九届蓝桥杯本科Java B组

这篇博客介绍了两种算法问题的解决方案。第一部分讲解了如何通过遍历第一象限的方格右上顶点来计算位于圆内的方格总数,从而解决方格计数问题。第二部分涉及全球变暖情景下的岛屿淹没计算,通过搜索和替换策略确定被淹没的岛屿数量。文章重点讨论了输入处理、栈的应用以及搜索算法的实现细节。

一、方格计数

解题思路:
以第一象限为例,遍历第一象限位于圈内的所有方格的右上角顶点(因为对这些方格而言,其右上角是最容易出圈的,如果它的右上角在圈内,那么这个方格一定在圈内),若此点到原点的距离小于半径,则数目加一。最后数目乘以四得总数。

至于为什么不用圆的半径除以小方格的对角线,原因如下:
圆内所有完整的小方格不一定正好组成一个大的正方形。因为小方格的边长小于对角线,这也就意味着沿坐标轴方向的小方格数一定不少于沿45°对角线方向的小方格数。

public class Fangge {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int num=0;
		for(int i=1;i<=1000;i++){//以第一象限为例,遍历方格的右上顶点
			for(int j=1;j<=1000;j++){
				if(i*i+j*j<=1000000){
					num++;
				}
			}
		}
		System.out.println(num*4);
	}

}

二、全球变暖

因为题目保证外圈都为海洋,所以开始从(1,1)坐标搜索,搜到“#”被淹没的岛屿数便加一,即num 自加。然后搜索该’#'的四周,若上下左右都不是“.”,说明该块区域四面被陆地包围,则该岛屿一定不会被淹没,淹没岛屿数num自减。然后调用change()函数将其四周与之相连的陆地区域都换成海洋“.”(可理解为我们手动淹没整个岛屿),防止后面多次搜索到该岛屿;若搜索到的“#”四周不全是“.”,则将该“#”换成“0”,表示已搜,以防多次搜索,紧接着调用find()函数将与之相连的“#”重复上述操作,直至确定该岛屿是否会被淹没。

难点:
1.输入字符型二维数组

for(int i=0;i<n;i++) {
			arr[i]=s.next().toCharArray();  
		}

2.的使用,要把上下左右都是陆地的那个陆地以及四周与之相连的陆地区域都换成海洋
Stack stack = new Stack<>();

import java.util.Scanner;
import java.util.Stack;
public class Quanqiu {
	static char[][]arr;
	static int num=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();
		arr =new char[n][n];
		

		for(int i=0;i<n;i++) {
			arr[i]=s.next().toCharArray();  
		}
		for(int i=1;i<n-1;i++) {
			for(int j=1;j<n-1;j++) {
				if(arr[i][j]=='#') {
					num++;
					find(i,j);
				}
			}
		}
		System.out.println(num);
	}
	public static void find(int x,int y) {
		arr[x][y]='0';
		if (arr[x + 1][y] != '.' && arr[x - 1][y] != '.' && arr[x][y + 1] != '.' && arr[x][y - 1] != '.') {
			num--;
			change(x, y);
			return;
		}

		if (arr[x + 1][y] == '#')
			find(x + 1, y);
		if (arr[x - 1][y] == '#')
			find(x - 1, y);
		if (arr[x][y + 1] == '#')
			find(x, y + 1);
		if (arr[x][y - 1] == '#')
			find(x, y - 1);

	}
	public static void change(int x,int y) {
		Stack<Integer> stack = new Stack<>();
		stack.add(x);
		stack.add(y);
		while (!stack.isEmpty()) {
			y = stack.pop();
			x = stack.pop();
			arr[x][y] = '.';
			if (arr[x + 1][y] != '.') {
				stack.add(x + 1);
				stack.add(y);
			}
			if (arr[x - 1][y] != '.') {
				stack.add(x - 1);
				stack.add(y);
			}
			if (arr[x][y + 1] != '.') {
				stack.add(x);
				stack.add(y + 1);
			}
			if (arr[x][y - 1] != '.') {
				stack.add(x);
				stack.add(y - 1);
			}
		}

	}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值