???477 2017-01-22 03:06 采纳率: 100%
浏览 905
已采纳

Java 小白求编写一道算法题 能运行出结果立即采纳

这是一道Java算法测试题,只是题目有点长,但看着图片和例子,耐心多读一下就能很容易明白,同学都说题目不难,但本人实在是小白,特此求助,能编写运行出结果立即采纳给分,拜托了。

现有大小为N行的正方形地图,编号从1到N,每行包含N个单元格,每列标有连续的英文大写字母(A,B,C等)。每个单元格通过行编号及列编号组成的串来标识:例如,“9C” 表示第9行中的第三单元,“15D”表示第15行中的第四单元。

如下图所示,现有几个最大面积不超过4个单元格组成的矩形,X表示被标记的单元格。

目标是计算 被X标记且标记满的矩形的数量 和 被X标记但未被标记满的矩形数量。(请看例子)

例如,下图显示了一个大小为N = 4的地图,两个蓝色矩形(一个正方形,一个长方形)和五个用字母“x”标记的单元格;

图片说明

在这个例子中,长方形的三个单元格已经被标记满,正方形只有一个单元格被标记,但未被标记满。在下一张图片中,标记满的矩形被显示为灰色,未标记满的矩形显示为红色:

图片说明

用字符串S表示矩形的位置,其分别包含描述矩形的左上角和右下角单元格的位置对。矩形之间用逗号分隔。如上图,S =“1B 2C,2D 4D”。字符串T表示被标记的单元格的位置,包含描述被击中的地图单元的位置:如图,T =“2B 2D 3D 4D 4A”。 S中的矩形和T中的被标记单元格可以以任何顺序出现。

写一个函数:

class Solution {public String solution(int N,String S,String T); }

设地图的大小为N,字符串S描述矩形位置,T描述被标记的单元格,要求返回具有两个数字的字符串:被标记满的矩形的数量和被标记但未被标记满的矩形数量,用逗号分隔。

例如,假设N = 4,S =“1B 2C,2D 4D”和T =“2B 2D 3D 4D 4A”,您的函数应返回“1,1”,如上所述。

  • 写回答

4条回答 默认 最新

  • 智_永无止境 2017-01-22 03:28
    关注

    class Solution {
    /*
    *N 表示地图大小
    *S 表示船只的大小
    *T 表示被命中的位置
    * N = 4,S =“1B 2C,2D 4D”和T =“2B 2D 3D 4D 4A”
    * */
    public static String solution(int N,String S,String T) throws Exception{
    int hitShipLostCount = 0;
    int hitShipRunCount = 0;
    //获取没亮船只
    if(S != null && S != ""){
    String[] ships = S.split(",");
    //遍历船只,获取船只的每个位置
    for (String ship : ships) {
    //获取船只最小位置
    String shipMin = ship.substring(0,ship.indexOf(" "));
    int xMin = Integer.valueOf(shipMin.charAt(0) + "");
    char yMin = shipMin.charAt(1);

                //获取船只最大位置
                String shipMax = ship.substring(ship.indexOf(" ") + 1);
                int xMax = Integer.valueOf(shipMax.charAt(0) + "");
                char yMax = shipMax.charAt(1);
                if(xMax <= N){
                    //定义集合保存船只的位置
                    List<String> shipPieces = new ArrayList<String>();
                    for (int i = xMin; i <= xMax; i++) {
                        for (int j = yMin; j <= yMax; j++) {
                            String s = (char)j + "";
                            shipPieces.add(i + s);
                        }
                    }
    
                    //获取被炮弹命中的位置,并去掉重复的
                    Set<String> shells = new HashSet<String>();
                    String[] shellsArr = T.split(" ");
                    for (String shell : shellsArr) {
                        shells.add(shell);
                    }
    
                    //用于记录船只被击中的碎片数
                    int count = 0;
                    for (String shipPiece : shipPieces) {
                        for (String shell : shells) {
                            if(shipPiece.equals(shell)){
                                count ++ ;
                            }
                        }
                    }
    
                    //被击中沉没船只的数量
                    if(count == shipPieces.size()){
                        hitShipLostCount ++ ;
                    }
    
                    //击中未沉没船只的数量
                    if(count > 0 && count < shipPieces.size()){
                        hitShipRunCount ++ ;
                    }
                }else{
                    throw new Exception("船只还没有完全进入地图");
                }
            }
        }
    
    
        return hitShipLostCount + "," + hitShipRunCount;
    }; 
    
    public static void main(String[] args) {
        try {
            String answer = solution(4,"1B 2C,2D 4D","2B 2D 3D 4D 4A");
            System.out.println(answer);
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    

    }

    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站