今日头条笔试【编程题 + 分析过程发现数学规律 + 回溯法】

本文包含两道编程题的解答,第一题利用回溯法计算将箱子从起点推至终点所需的最少步骤;第二题根据房间内人数及最后分配位置逆向求解初始状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程题

题目1:(回溯法)

  • 【题目描述】给定一个矩阵,从某点出发,找到箱子,然后把箱子推到目的地。计算最少使用多少步。无法到达用-1表示。

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
			String str = in.nextLine();
			String[] data = str.split(" ");
			int n = Integer.valueOf(data[0]);
			int m = Integer.valueOf(data[1]);
			List<String> strList = new ArrayList(n);
			for(int i = 0 ; i < n; i++){
				strList.add(in.nextLine());
			}
			//转化为字符矩阵。
			char[][] matrix = getMatrix(strList, n, m);
			//发现各自的位置
			int startX = -1,startY = -1;
			int boxX = -1,boxY = -1;
			int targetX = -1,targetY = -1;
			for(int i =0;i < n;i++){
				for(int j =0;j < m;j++){
					if(matrix[i][j]=='S'){
						startX = i;
						startY = j;
					}else if(matrix[i][j]=='0'){
						boxX = i;
						boxY = j;
					}else if(matrix[i][j]=='E'){
						targetX = i;
						targetY = j;
					}
				}
			}
			
			//出发到找到箱子最小。
			int findBox = getMinSteps(matrix,startX, startY, boxX, boxY, n, m);
			if(findBox == -1){
				System.out.println(-1);
			}else{
				//从箱子到目的地最小化。
				int findTarget = getMinSteps(matrix,boxX, boxY, targetX, targetY, n, m);
				if(findTarget == -1){
					System.out.println(-1);
				}else{
					System.out.println(findBox + findTarget +1);
				}
			}
	}
	
	public static char[][] getMatrix(List<String> data,int n ,int m){
		char[][] result  = new char[n][m];
		for(int i = 0; i < n ; i++){
			for(int j = 0; j < m ;j ++){
				result[i][j] = data.get(i).charAt(j);
			}
		}
		return result;
	}

	public static int getMinSteps(char[][] matrix,int startX,int startY,int endX,int endY,int n,int m){
		if(startX < 0 || startY < 0 || startX >= n || startY >= m || matrix[startX][startY]== '#' || matrix[startX][startY] == 'V'){
			return -1;
		}
		if(startX == endX  && startY == endY){
			return 0;
		}
		
		int ways[] = new int[4];
		char preState = matrix[startX][startY];
		matrix[startX][startY] = 'V';//表示已访问
		ways[0] = getMinSteps(matrix,startX +1,startY,endX,endY,n, m);
		ways[1] = getMinSteps(matrix ,startX -1, startY, endX, endY, n, m);
		ways[2] = getMinSteps(matrix,startX, startY+1, endX, endY, n, m);
		ways[3] = getMinSteps(matrix,startX, startY-1, endX, endY, n, m);
		matrix[startX][startY] = preState;
		int result = Integer.MAX_VALUE;
		for(int i = 0; i < 4;i++){
			if(ways[i] >= 0 && result > ways[i]){
				result = ways[i];
			}
		}
		return result == Integer.MAX_VALUE ? -1 : result+1;
	}
}


题目2:(发现数字规律)

  • 【题意】有n个房间,i 号 房间里的人取出,然后重新分配,分配规则:让 i 号房间中的人全部出来,接下来按照 i + 1,i + 2, i + 3...进行分配,直到所有的人都分配完毕。n 号 房间的 下一个房间是 1 号房间。现在给出分配完后的每个房间的人以及最后一个人被分配的房间x,求出分配前每个房间的人数。
  • 【技巧】 在纸上运行一个简单的例子,人脑分析,通过这个过程就能够发现一些规律。(最初的状态,能进行区分的状态,可以作为还原终止的场景)

 public class Main2 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int x = in.nextInt();
		int[] people = new int[n + 1];
		for (int i = 1; i <= n; i++) {
			people[i] = in.nextInt();
		}
		findOrigin(n, x, people);
	}

	public static void findOrigin(int n, int x, int[] people) {
		int count = 0;
		int i = x;
		while (true) {
			//到达0时说明,该处数据被清空了,用来填补之前的数据。(符合逻辑,题目的规则)
			if (people[i] == 0) {
				break;
			}
			people[i]--;
			count++;
			i = (i - 1 + n) % n == 0 ? n : (i - 1 + n) % n; // 向后退位。
		}

		people[i] = count;
		for (int j = 1; j <= n; j++) {
			if (j == 1) {
				System.out.print(people[j]);
			} else {
				System.out.print(" " + people[j]);
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值