派送员问题——————人生第一次在考试中编程题过了

本文介绍了一种使用递归算法解决派送员寻找从起点出发,经过多个指定位置后返回起点的最短往返路径的问题。通过递归尝试所有可能的路径组合,并计算总距离来找到最优解。

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

题目描述

   派送员在地图的(0,0)位置,地图的边城都为1,给出几个位置(点),请问派送员送餐的最短往返距离距离(送完所有位置的行走最短距离+最后送完的位置到0,0的距离)。

  思路:采用递归。找出所有情况。

 代码如下:

package 秋招练习;

import java.util.Scanner;

public class 派送员 {
	//递归
	static int res=Integer.MAX_VALUE;//最终结果
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		
		int n=in.nextInt();
		Point[] points=new Point[n];
		boolean[] flag=new boolean[n];
		for(int i=0;i<n;i++){
			String[] s=in.next().split(",");
			int x=Integer.valueOf(s[0]);
			int y=Integer.valueOf(s[1]);
			points[i]=new Point(x, y);
		}
		getRes(points, 0, 0, flag, 0, 0);
		System.out.println(res);
	}
    //参数介绍:points为点的集合,index为走了多少个地方的----就一个计数器,sum为目前走了多少距            
    //离,flag数组为已经走了那些地方,x, y为当前的坐标
	public static void getRes(Point[] points,int index,int sum,boolean[] flag,int x,int y){
		if(index==points.length){//表示所有地方走完了。更新res变量
			res=Math.min(res, sum+Math.abs(x)+Math.abs(y));
			return ;
		}
		for(int i=0;i<points.length;i++){
			if(!flag[i]){
                //走过的地方更新为true
				flag[i]=true;
                //更新距离。
				sum+=Math.abs(points[i].x-x)+Math.abs(points[i].y-y);
				getRes(points, index+1, sum, flag,points[i].x, points[i].y);
                //递归结束要退回来,好让其他的递归操作这个数组。
				flag[i]=false;
			}
		}
	}
}

题目测试数据:

输入:
4
2,2
2,8
4,4
7,2
输出:
30
输入范例:
3
2,2
2,8
6,6
输出范例:
28

记录这一时刻。成长的一第一步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值