1、(可以组成网络的服务器):
这段代码是解决“可以组成网络的服务器”的问题。它提供了一个Java类Main
,其中包含main
方法和getResult
方法,以及一个辅助方法bfs
,用于统计机房中最大的局域网包含的服务器个数。
main
方法首先读取二维数组的行数n
和列数m
,然后读取服务器信息矩阵matrix
。接着,调用getResult
方法并打印结果。
getResult
方法遍历服务器信息矩阵,对于每个服务器(用1表示),使用bfs
方法进行广度优先搜索,以找到最大的局域网。bfs
方法使用一个队列path
来存储待检查的服务器坐标,并通过邻接节点的检查来扩展局域网。每找到一个新服务器,就将其添加到队列中,并将其状态标记为已访问(用0表示)。当队列为空时,表示已经找到了从当前服务器出发的最大局域网。
最后,getResult
方法返回最大的局域网大小。
2、(用连续自然数之和来表达整数):
这段代码是解决“用连续自然数之和来表达整数”的问题。它提供了一个Java类Main
,其中包含main
方法和getResult
方法,用于找出一个整数的所有可能的连续自然数之和的表达式,并打印每种表达式以及它们的个数。
main
方法读取目标整数n
,然后调用getResult
方法并打印所有可能的表达式和最终的表达式个数。
getResult
方法使用滑动窗口技术来找出所有可能的连续自然数序列,这些序列的和等于目标整数n
。通过移动左右指针left
和right
,代码可以找到所有可能的连续序列,并记录它们的起始索引和结束索引。找到所有序列后,使用StringJoiner
来构建每个序列的表达式字符串,并按序列长度升序排列。
最后,getResult
方法返回一个包含所有表达式和最终表达式个数的列表。
package OD233;import java.util.LinkedList;
import java.util.Scanner;/*** @description 可以组成网络的服务器* @level 6* @score 200* @url https://hydro.ac/d/HWOD2023/p/OD233*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {static int[][] offsets = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};private static int n;private static int m;private static int[][] matrix;public static void main(String[] args) {Scanner sc = new Scanner(System.in);//n行 m列n = sc.nextInt();m = sc.nextInt();//服务器矩阵matrix = new int[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {matrix[i][j] = sc.nextInt();}}//输出最大局域网的服务器个数System.out.println(getResult());}public static int getResult() {//记录题解,不断更新较大值int ans = 0;//遍历,从每一个起点扩散for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {//如果是1,则进行bfs递归,找到该点最多能扩散的局域网服务器个数if (matrix[i][j] == 1) {ans = Math.max(ans, bfs(i, j));}}}return ans;}/*** 从matrix[i][j]为中心,扩散寻找最多的局域网服务器* 类似LeetCode200题,岛屿数量 : https://leetcode.cn/problems/number-of-islands/description/** @param i* @param j* @return int* @create 2024/4/3 17:13*/public static int bfs(int i, int j) {//储存找到服务器的坐标LinkedList<int[]> path = new LinkedList<>();//初始matrix[i][j]=1,所以初始count=1matrix[i][j] = 0;int count = 1;//添加起点path.add(new int[]{i, j});while (path.size() > 0) {int[] pos = path.removeFirst();int x = pos[0];int y = pos[1];//向四周位移扩散for (int[] offset : offsets) {int newX = x + offset[0];int newY = y + offset[1];//如果没有越界且是服务器if (newX >= 0 && newX < n && newY >= 0 && newY < m && matrix[newX][newY] == 1) {//找到的服务器+1count++;//添加到坐标集合path.add(new int[]{newX, newY});//把该点设为1,防止回头matrix[newX][newY] = 0;}}}//返回最大局域网服务器个数return count;}}
package OD241;import java.util.*;/*** @description 用连续自然数之和来表达整数* @level 5* @score 100*//*** 题目描述* 一个整数可以由连续的自然数之和来表示。* <p>* 给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式* <p>* 输入描述* 一个目标整数T (1 <=T<= 1000)* <p>* 输出描述* 该整数的所有表达式和表达式的个数。* <p>* 如果有多种表达式,输出要求为:自然数个数最少的表达式优先输出,每个表达式中按自然数递增的顺序输出,具体的格式参见样例。* <p>* 在每个测试数据结束时,输出一行”Result:X”,其中X是最终的表达式个数。*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();//存放结果ArrayList<String> result = getResult(n);result.forEach(System.out::println);}public static ArrayList<String> getResult(int t) {//存放结果ArrayList<String> result = new ArrayList<>();//创建一个从1-n的数组,使用滑动窗口int[] arr = new int[t];for (int i = 0; i < t; i++) {arr[i] = i + 1;}int left = 0;int right = 1;//初始化和int sum = arr[left];//存放步骤和ArrayList<int[]> ans = new ArrayList<>();//当左指针到达数组末尾,结束循环while (left < t) {//如果小于n,则左指针移动if (sum > t) {sum -= arr[left++];} else if (sum == t) {//记录此时的数组元素 包括left 不包含rightans.add(Arrays.copyOfRange(arr, left, right));//窗口往右移动sum -= arr[left++];//此时right有可能已经到达数组末尾if (right >= t) {break;}//没有到达边界则往右移动sum += arr[right++];} else {//sum<n 右指针往右移动sum += arr[right++];}}//排序 按长度升序ans.sort(Comparator.comparing(a -> a.length));ans.forEach(a -> {StringJoiner sj = new StringJoiner("+", t + "=", "");//前缀是n= 连接符是+ 后置是""Arrays.stream(a).forEach(i -> sj.add(i + ""));result.add(sj.toString());});result.add("Result:" + ans.size());return result;}
}