原题链接:流感传染
解题思路:
注意事项:
参考代码:
import java.util.Scanner;
public class 流感传染 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 从用户输入中读取一个整数n,代表网格的边长
sc.nextLine(); // 读取整数后的换行符,确保之后的nextLine能正确读取
char[][] grid = new char[n][n]; // 初始化一个n*n的字符网格
// 读取n行输入,填充到字符网格中
for (int i = 0; i < n; i++) {
String line = sc.nextLine(); // 读取一行输入
for (int j = 0; j < n; j++) {
grid[i][j] = line.charAt(j); // 将字符填充到网格的相应位置
}
}
int m = sc.nextInt(); // 从用户输入中读取一个整数m,代表经过的天数
sc.close(); // 关闭扫描器,释放资源
// 模拟m-1天的感染传播情况(因为最后一天的情况不需要再次传播)
for (int day = 0; day < m-1; day++) {
spreadInfection(grid, n); // 调用spreadInfection函数进行感染传播
}
// 计算并输出第m天的感染人数
int infectedCount = countInfected(grid, n);
System.out.println(infectedCount);
}
// 感染传播函数
private static void spreadInfection(char[][] grid, int n) {
char[][] tempGrid = new char[n][n]; // 创建一个临时网格用于模拟感染传播后的情况
// 初始化临时网格为当前网格的状态
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
tempGrid[i][j] = grid[i][j];
}
}
// 遍历当前网格中的每个位置,如果是感染状态'@',则向其四周传播感染
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '@') { // 当前位置是感染状态
spreadToNeighbors(tempGrid, i, j, n); // 调用spreadToNeighbors函数向四周传播感染
}
}
}
// 更新原网格为临时网格的状态(即感染传播后的状态)
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
grid[i][j] = tempGrid[i][j];
}
}
}
// 向四周传播感染函数
private static void spreadToNeighbors(char[][] grid, int row, int col, int n) {
int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 定义上、下、左、右四个方向
// 遍历四个方向,尝试向每个方向传播感染
for (int[] dir : directions) {
int newRow = row + dir[0]; // 计算新位置的行坐标
int newCol = col + dir[1]; // 计算新位置的列坐标
// 检查新位置是否在网格范围内且为未感染状态'.',如果是则将其感染为'@'
if (newRow >= 0 && newRow < n && newCol >= 0 && newCol < n && grid[newRow][newCol] == '.') {
grid[newRow][newCol] = '@'; // 感染新位置
}
}
}
// 计算并返回网格中的感染人数(即'@'的个数)
private static int countInfected(char[][] grid, int n) {
int count = 0; // 初始化感染人数为0
// 遍历网格中的每个位置,统计感染人数
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '@') { // 当前位置是感染状态
count++; // 感染人数加1
}
}
}
return count; // 返回感染人数
}
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复