黑马程序员技术交流社区

标题: 今天练习这道题的时候没什么思路,求解答,谢谢!~ [打印本页]

作者: samge    时间: 2016-1-8 00:03
标题: 今天练习这道题的时候没什么思路,求解答,谢谢!~
输入N个城市,是字母形式,名字中间没有空格,碰到###结束,然后手动输入两两距离
比如, (如果输入3个城市) 那就如下    1-2相距300 1-3相距500 2-3相距200
*        1         2         3
* 1     0       300      500
* 2   300       0        200
* 3   500     300        0
* 输入 两个城市名称
* 输出 距离

作者: dengwenqiang    时间: 2016-1-8 00:03
全手写,思路也很全,不容易啊,楼主请采纳我的答案吧~

public class CitysDistance {
    public static void main(String[] args) {
        // 创建map集合存储城市和对应编号
        HashMap<String, Integer> hm = new HashMap<String, Integer>();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入任意数量的城市,以###号结束");
        int count = 0;// 记录每个城市对应的索引
        while (true) {
            String city = sc.nextLine();
            if ("###".equals(city)) {
                break;
            } else {
                hm.put(city, ++count);
            }
        }
        // 创建一个二维数组表示两两城市的距离
        int[][] distance = new int[count][count];
        // 记录两两城市间的距离
        System.out.println("请录入两两城市间的距离:");
        for (int i = 0; i < distance.length; i++) {
            for (int j = 0; j < distance.length; j++) {
                // 键盘录入距离
                distance[i][j] = sc.nextInt();
            }
        }

        // 方便查询,做成死循环
        while (true) {
            // 键盘录入两个城市
            System.out.println("请输入你想要查询的两个城市:");
            String city1 = sc.next();
            String city2 = sc.next();
            // 通过键找到值,而这个值又作为二维数组的索引
            int index1 = hm.get(city1);
            int index2 = hm.get(city2);
            // 通过索引找到距离
            System.out.println(city1 + "和" + city2 + "的距离是:"
                    + distance[index1 - 1][index2 - 1]);
            System.out.println("还要查询吗,查询则按1,不查询按2");
            
            int num = sc.nextInt();
            if (num==1) {
                continue;
            }else if (num==2) {
                break;
            }else{
                System.out.println("输入错误,下次再会!");
                break;
            }
        }
    }
}

作者: 擎天柱    时间: 2016-1-8 14:31
用二维数组就好了,城市名称就是下标;如果城市名不是数值,就增加x,y两个变量记录每个城市的坐标。
作者: 胆小的狙击手    时间: 2016-1-8 23:40
同意一楼的思路,但是,我觉得应该把Integer的索引作为键,String的城市名作为值会比较合适一点
作者: samge    时间: 2016-1-9 00:23
胆小的狙击手 发表于 2016-1-8 23:40
同意一楼的思路,但是,我觉得应该把Integer的索引作为键,String的城市名作为值会比较合适一点 ...

如果用索引作为键的话,那样会出现值相同,也就是相同城市对应不同索引的问题吧
作者: 不要轻言放弃    时间: 2016-1-9 01:26
此题很有水平




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2