索引
数组扩散
思路:模拟扩散,暴力破解
/**
* 题目:
* 存在一个m*n的二维数组,其成员取值范围为0或1。其中值为1的成员具备扩散性,
* 每经过1S,将上下左右值为0的成员同化为1。
* 二维数组的成员初始值都为0,将第[i,j]和[k,l]两个位置上元素修改成1后,求矩阵的所有元素变为1需要多长时间。
*
* 输入描述:
* 前两个数是矩阵m*n,中间两个数是第一个点的坐标,最后两个数是第二个点的坐标
* 其中这两个点初始为1,其他点初始为0
*
* 输出描述:
* 输出矩阵的所有元素变为1所需要秒数。
*/
public class MatrixDiffusion {
public static void main(String[] args) {
int[] input = new int[]{4, 4, 0, 0, 3, 3};
int result = getTime(input);
System.out.println(result);
}
/**
* 思路:模拟扩散,暴力破解
*/
private static int getTime(int[] input) {
int xMax = input[0];
int yMax = input[1];
int xA = input[2];
int yA = input[3];
int xB = input[4];
int yB = input[5];
int[][] matrix = new int[xMax][yMax];
// 初始化
for (int x =0; x < xMax; x++) {
for (int y = 0; y < yMax; y++) {
matrix[x][y] = 0;
// 把初始的两个点改成1
if (x == xA && y == yA || x == xB && y == yB) {
matrix[x][y] = 1;
}
}
}
// 是否继续扩散
boolean needContinue = true;
// 扩散次数
int count = 0;
// 模拟扩散
while (needContinue) {
// 每次扩散前假设这次扩散后就结束了
needContinue = false;
// 本次操作是否真实的扩散了
boolean curDid = false;
// 先扩散成2(因为本次信扩散的点不能扩散)
for (int x =0; x < xMax; x++) {
for (int y = 0; y < yMax; y++) {
if (matrix[x][y] == 1) {
int topX = x - 1;
int topY = y;
if (topX >= 0 && topX < xMax && matrix[topX][topY] == 0) {
matrix[topX][topY] = 2;
curDid = true;
}
int leftX = x;
int leftY = y - 1;
if (leftY >= 0 && leftY < yMax && matrix[leftX][leftY] == 0) {
matrix[leftX][leftY] = 2;
curDid = true;
}
int belowX = x + 1;
int belowY = y;
if (belowX >= 0 && belowX < xMax && matrix[belowX][belowY] == 0) {
matrix[belowX][belowY] = 2;
curDid = true;
}
int rightX = x;
int rightY = y + 1;
if (rightY >= 0 && rightY < yMax && matrix[rightX][rightY] == 0) {
matrix[rightX][rightY] = 2;
curDid = true;
}
}
}
}
// 本次扩散了就将扩散次数加一
if (curDid) {
count++;
}
// 善后:把2修改成1,让下一次正常扩散,并且判断需不需要进一步扩散
for (int x =0; x < xMax; x++) {
for (int y = 0; y < yMax; y++) {
if (matrix[x][y] == 2) {
matrix[x][y] = 1;
}
// 还有0的就继续扩散
if (matrix[x][y] == 0) {
needContinue = true;
}
// 输出扩散的中间结果
System.out.print(matrix[x][y] + " ");
}
// 输出扩散的中间结果
System.out.println();
}
// 输出扩散的中间结果
System.out.println("\n");
}
return count;
}
}

身高排序
import java.util.ArrayList;
import java.util.List;
/**
* 题目:
* 小明今年升学到小学一年级,来到新班级后发现其他小朋友们身高参差不齐,
* 然后就想基于各小朋友和自己的身高差对他们进行排序,请帮他实现排序。
*
* 输入:
* 第一行为正整数H和N,0<H<200,为小明的身高,O<N<50,为新班级其他小朋友个数。
* 第二行为N个正整数H1-HN,分别是其他小朋友的身高,取值范围O<Hi<200(1<=i<=N),且N个正整数各不相同。
*
* 输出描述:
* 输出排序结果,各正整数以空格分割,和小明身高差绝对值最小的小朋友排在前面,
* 和小明身高差绝对值最大的小朋友排在最后,如果两个小朋友和小明身高差一样,则个子较小的小朋友排在前面。
*/
public class HeightSort {
public static void main(String[] args) {
String firstLine = "100 10";
String secondLine = "95 96 97 98 99 101 102 103 104 105";
String[] studentHeightArr = secondLine.split(" ");
List<HeightDiff> heightDiffList = new ArrayList<>();
int xiaoMingHeight = Integer.parseInt(firstLine.split(" ")[0]);
for (String height : studentHeightArr) {
heightDiffList.add(new HeightDiff(Integer.parseInt(height), xiaoMingHeight));
}
heightDiffList.sort((o1, o2) -> {
if (o1.diff < o2.diff) {
return -1;
} else if (o1.diff > o2.diff) {
return 1;
} else if (o1.height < o2.height) {
return -1;
} else if (o1.height > o2.height) {
return 1;
}
return 0;
});
System.out.println(heightDiffList);
}
static class HeightDiff {
// 同学身高
int height;
// 和小明身高差
int diff;
/**
* @param height 同学身高
* @param xiaoMingHeight 小明身高
*/
public HeightDiff(int height, int xiaoMingHeight) {
this.height = height;
this.diff = Math.abs(xiaoMingHeight - height);
}
@Override
public String toString() {
return height + "";
}
}
}
原创文章,作者:geekgao,如若转载,请注明出处:https://www.geekgao.cn/archives/2888

微信
支付宝
评论列表(1条)
身高排序这题调试不通过啊