`
leon_a
  • 浏览: 79145 次
  • 性别: Icon_minigender_1
  • 来自: 拜月神教
社区版块
存档分类
最新评论

《程序员》算法擂台:骑士聚会

阅读更多
在8×8的棋盘上分布着n个骑士,他们想约在某一个格中聚会。骑士每天可以像国际象棋中的马那样移动一次,可以从中间向8个方向移动,请你计算n个骑士的最早聚会地点和要走多少天,要求尽早聚会,且n个人走的总步数最少,先到聚会地点的骑士可以不再移动等待其他的骑士。
从键盘输入n(0<n<=64),然后一次输入n个其实的初始位置xi,yi(0<=xi,y<=7)。屏幕输出以空格分割的三个数,分别为聚会的点(x,y) 以及要走的天数。
 ○ ○ 
○   ○
  ◎
○   ○
 ○ ○ 
骑士走法(中间为起始位置,空为走到位置)
package convex;   
  
public class Point {   
  
    public int x, y;   
  
    public Point(int x, int y) {   
        if (x > 7 || y > 7) {   
            throw new RuntimeException("out of matrix");   
        }   
        this.x = x;   
        this.y = y;   
    }   
  
    public String toString() {   
        return "x=" + x + ",y=" + y;   
    }   
  
}   

package convex;         
     
import java.io.BufferedReader;      
import java.io.IOException;      
import java.io.InputStreamReader;      
import java.util.StringTokenizer;      
     
import convex.Point;         
        
public class Algo {         
     
    private boolean[][] flg = new boolean[8][8];      
     
    private int[][] shortPath = new int[8][8];      
          
    //最短距离矩阵      
    public int[][] distanceSq(Point p1) {      
        djkst(p1);      
        return shortPath;      
    }      
     
    //BFS       
    private void djkst(Point p1) {      
        Point[] queue = new Point[64];      
        flg[p1.x][p1.y] = true;      
        queue[0] = p1;      
        int j=0;      
        int queueSize = 1;      
        while (j < queue.length) {      
                Point temp = queue[j];      
                Point[] list = getList(temp);      
                for(int i=0;i < list.length;i++) {      
                    if(list[i] != null) {      
                        Point w = list[i];      
                        if (!flg[w.x][w.y]) {      
                            shortPath[w.x][w.y] = shortPath[temp.x][temp.y] + 1;                                  
                            queue[queueSize++] = w;      
                            flg[w.x][w.y] = true;      
                        }      
                    }      
                }      
            j++;      
        }      
    }      
     
    //可行步数集         
    private static Point[] getList(Point point) {      
        Point[] list = new Point[8];      
        int length = 0;      
        if (point.x + 2 <= 7 && point.y + 1 <= 7) {      
            list[length++] = new Point(point.x + 2, point.y + 1);      
        }      
        if (point.x - 2 >= 0 && point.y - 1 >= 0) {      
            list[length++] = new Point(point.x - 2, point.y - 1);      
        }      
        if (point.x + 1 <= 7 && point.y + 2 <= 7) {      
            list[length++] = new Point(point.x + 1, point.y + 2);      
        }      
        if (point.x - 1 >= 0 && point.y - 2 >= 0) {      
            list[length++] = new Point(point.x - 1, point.y - 2);      
        }      
        if (point.x + 2 <= 7 && point.y - 1 >= 0) {      
            list[length++] = new Point(point.x + 2, point.y - 1);      
        }      
        if (point.x - 2 >= 0 && point.y + 1 <= 7) {      
            list[length++] = new Point(point.x - 2, point.y + 1);      
        }      
        if (point.x + 1 <= 7 && point.y - 2 >= 0) {      
            list[length++] = new Point(point.x + 1, point.y - 2);      
        }      
        if (point.x - 1 >= 0 && point.y + 2 <= 7) {      
            list[length++] = new Point(point.x - 1, point.y + 2);      
        }      
        return list;      
    }      
          
    public static int[] method(Point[] points, int i,int j,Object[] pointList) {         
        int maxDay = 0;         
        int distance = 0;      
        for(int k=0;k<pointList.length;k++) {      
            int day = ((int[][])pointList[k])[i][j];      
            distance += day;      
            if(maxDay<day) {      
                maxDay = day;      
            }      
        }      
        return new int[]{maxDay,distance};         
    }      
        
    public static void main(String[] args) throws IOException {      
        //数据输入      
        //数据输入格式:第一个数字是骑士n,第2,3个数字是第一个骑士的坐标,依次类推。      
        //每个数字之间以空格区分      
        BufferedReader stdin =       
            new BufferedReader(      
                new InputStreamReader(System.in));      
     
        String line = stdin.readLine();      
        StringTokenizer st = new StringTokenizer(line);      
        int pointLength = Integer.parseInt(st.nextToken());      
        Point[] points = new Point[pointLength];      
        for(int i=0;i<points.length;i++) {      
            int x = Integer.parseInt(st.nextToken());      
            int y = Integer.parseInt(st.nextToken());      
            points[i] = new Point(x,y);      
        }      
        Object[] pointList = new Object[points.length];      
        for (int j = 0; j < points.length; j++) {         
            pointList[j] = new Algo().distanceSq(points[j]);      
        }      
        int minDay = 999999999;      
        int minDistance = 999999999;        
        for(int i=0;i<7;i++) {      
            for(int j=0;j<7;j++) {      
                int[] result = Algo.method(points, i,j,pointList);         
                //找最短天数,最短天数相同,找最短距离      
                if (minDay > result[0]) {      
                    minDay = result[0];      
                    minDistance = result[1];      
                } else if(minDay == result[0]) {      
                    if(minDistance > result[1]) {      
                        minDistance = result[1];      
                    }      
                }      
            }      
        }      
        for(int i=0;i<7;i++) {      
            for(int j=0;j<7;j++) {      
                int[] result = Algo.method(points, i,j,pointList);    
                if(minDay == result[0] && minDistance == result[1]) {   
                    System.out.println(i+" " + j +" "+ minDay);   
                }   
            }   
        }    
    }      
}     
3
0
分享到:
评论

相关推荐

    《程序员》9期算法擂台“骑士聚会”源代码

    9期的算法擂台栏目聚焦于“骑士聚会”问题,这是一个涉及算法设计与实现的经典挑战。这个挑战源自于数学游戏,通常与图论或组合优化相关,旨在模拟中世纪骑士在棋盘上的排列方式。 "骑士聚会"问题来源于国际象棋,...

    《程序员编程艺术:面试和算法心得》

    《程序员编程艺术:面试和算法心得》是一本深入探讨编程面试和算法的书籍,主要针对的是准备面试的程序员,特别是那些关注技术深度和广度,以及如何在面试中展现出自己能力的开发者。这本书可能涵盖了从基础数据结构...

    程序员编程艺术:面试和算法心得.pdf

    • 第六章 海量数据处理 o 6.0 本章导读 o 6.1 关联式容器 o 6.2 分而治之 o 6.3 simhash 算法 o 6.4 外排序 o 6.5 MapReduce o 6.6 多层划分 o 6.7 Bitmap o 6.8 Bloom filter o 6.9 Trie 树 o 6.10 数据库 o 6.11 ...

    程序员模板2:软件功能设计报告.doc

    程序员模板2:软件功能设计报告.doc

    程序员软技能:代码之外的生存指南

    视频课程下载——程序员软技能:代码之外的生存指南

    程序员算法趣题——随书源码

    《程序员算法趣题——随书源码》是一个与算法相关的学习资源,包含了增井敏克著作《程序员算法趣题》中的实例代码。增井敏克是算法领域知名的专家,他的书籍通常深入浅出,旨在帮助程序员提升算法思维和解决实际问题...

    精品--一款漂亮大气的程序员简历模板:适用于PHP程序员、iOS程序员、Android程序员、Web前端程序员、Ja.zip

    精品--一款漂亮大气的程序员简历模板:适用于PHP程序员、iOS程序员、Android程序员、Web前端程序员、Ja

    程序员算法面试笔试大全下载

    在程序员的面试和笔试过程中,数据结构与算法是不可或缺的核心部分。这些知识不仅考察了候选人的编程基础,更深入地体现了他们对问题解决能力和效率优化的理解。本资源"程序员算法面试笔试大全data structures and ...

    程序员面试宝典:算法与数据结构基础教程.md

    在计算机编程领域,面试是检验一个程序员技术能力的重要环节。本教程旨在帮助程序员系统地准备面试,特别是算法与数据结构部分,这是面试中的核心内容。

    程序员代码面试指南:IT名企算法与数据结构题目最优解-代码

    《程序员代码面试指南:IT名企算法与数据结构题目最优解-代码》是一部专为准备IT企业面试的程序员量身定制的指南。本书的核心内容围绕算法和数据结构展开,通过Java语言实现,旨在帮助读者掌握解决常见面试问题的...

    程序员的算法趣题.pdf.zip

    《程序员的算法趣题》是一本专门为IT从业者和有志于进入这个领域的学习者准备的算法书籍。它通过一系列有趣且富有挑战性的题目,旨在帮助读者深入理解和掌握计算机科学中的核心算法,提升解决实际问题的能力。这本书...

    算法精解 c语言 中文版

    算法精解 c语言 中文版,适合学习算法和程序员 算法精解:C语言描述 中文版 pdf

    程序员的数学4:图论入门.pptx

    "程序员的数学4:图论入门" 本书《程序员的数学4:图论入门》是一本面向程序员群体的数学读物,旨在介绍图论的基本概念和应用。图论是一门研究图形和结构的学科,其中节点和边分别表示对象和它们之间的关系。在编程...

    程序员做饭指南:HowToCook

    项目标签:[程序员文化] [生活指南] 推荐理由:一份程序员做饭指南,提供了极其详尽的菜谱。这份指南以程序员的语言和思维方式呈现,消除了模糊的量词和难以理解的操作。从主食到甜品,菜单应有尽有,为程序员提供了...

    程序员面试算法大全

    《程序员面试算法大全》是一本面向准备面试的程序员的重要参考资料,涵盖了广泛的算法和数据结构知识。这本书通过详细的代码实现和解题思路,帮助读者提升在面试中的表现,从而提高获得理想职位的机会。以下是对其中...

    算法精解:C语言描述(中文版).pdf

    适合学习算法和程序员。算法精解:C语言描述(中文版).pdf

    程序员_算法:프로그래머스알고리즘

    "程序员_算法:프로그래머스알고리즘"这一主题旨在探讨和学习如何运用算法来解决实际编程问题,特别是通过Python语言实现。 首先,Python语言因其简洁明了的语法而深受程序员喜爱,同时也是学习算法的理想选择。...

    程序员实用算法.zip

    在IT行业中,算法是程序员的核心技能之一,它们是解决问题和设计高效程序的基础。"程序员实用算法.zip"这个压缩包很可能包含了一系列与编程相关的算法实现、解释或案例,旨在帮助程序员提升这方面的能力。以下是对...

    程序员实用算法.pdf

    《程序员实用算法》这本书主要涵盖了计算机科学中程序员经常会遇到的各种算法,这些算法是解决实际问题、优化程序性能的关键。在编程领域,算法就如同工具箱中的各种工具,它们可以帮助程序员高效地处理数据,解决...

Global site tag (gtag.js) - Google Analytics