一、方格计数
解题思路:
以第一象限为例,遍历第一象限位于圈内的所有方格的右上角顶点(因为对这些方格而言,其右上角是最容易出圈的,如果它的右上角在圈内,那么这个方格一定在圈内),若此点到原点的距离小于半径,则数目加一。最后数目乘以四得总数。
至于为什么不用圆的半径除以小方格的对角线,原因如下:
圆内所有完整的小方格不一定正好组成一个大的正方形。因为小方格的边长小于对角线,这也就意味着沿坐标轴方向的小方格数一定不少于沿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);
}
}
}
}
这篇博客介绍了两种算法问题的解决方案。第一部分讲解了如何通过遍历第一象限的方格右上顶点来计算位于圆内的方格总数,从而解决方格计数问题。第二部分涉及全球变暖情景下的岛屿淹没计算,通过搜索和替换策略确定被淹没的岛屿数量。文章重点讨论了输入处理、栈的应用以及搜索算法的实现细节。
9078

被折叠的 条评论
为什么被折叠?



