Java 小白求编写一道算法题

约翰和他的朋友索尼娅打一场战舰游戏。游戏在N行的正方形地图上进行,编号从1到N.每行包含N个单元格,每列标有连续的英文大写字母(A,B,C等)。每个单元通过由其行编号及其列编号组成的串来标识:例如,“9C” 表示第9行中的第三单元,“15D”表示第15行中的第四单元。

如下图所示,船只由最大面积为4个单元格的矩形定义,X落在船上时表示船被击中,如果一个船每个部位被击中,则该船被沉没。
图片说明

目标是计算沉没的船只的数量和被击中但未沉没的船只的数量。

例如,下图显示了一个大小为N = 4的地图,两个蓝色船只和五个用字母“x”标记的命中;
图片说明
在这个例子中,一艘船已经沉没,另一艘已经被击中但没有沉没。在下一张图片中,沉船被显示为灰色,被击中但尚未沉没的船舶显示为红色:

船的位置被给出为字符串S,其包含分别描述每艘船的左上角和右下角单元的位置对。船舶的描述用逗号分隔。命中的位置为字符串T,包含描述被击中的地图单元的位置:对于上述示例中的地图,S =“1B 2C,2D 4D”和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”,如上所述。

5个回答

小白大学没认真学java,这是一道算法考试题,需要用java编写,希望有大神帮忙解答一下,题目有点长,但仔细读一下,看下举例就能明白。java编写出来能运行出结果就直接采纳给分,真心拜托了

qq_19857675
qq_19857675 我脑残采纳错了!! 麻烦回答了的大神去我最新的提问,相同的问题,我直接把采纳给您
大约 3 年之前 回复

如果一个船每个部位被击中,则该船被沉没。 求翻译

qq_19857675
qq_19857675 我的图插错位置了,一共就两个图
大约 3 年之前 回复
qq_19857675
qq_19857675 右边那个长方形也代表一只船,它每个部位都有一个x则是说每个部位都被击中了,则表示这只船被击中且沉没了
大约 3 年之前 回复
qq_19857675
qq_19857675 X代表的是击中部位,如果比如图1中的正方形代表一只船,左下角有个x,则表示它被击中了,但没有沉没。
大约 3 年之前 回复

如果26个字母用完了怎么办

N基本没啥用!超出字母的这段程序不能用,行大于9的这段程序也需要改改,大概思路就是这么处理,大同小异!

public String solution(int N, String S, String T){
        int x = 0; //命中的数量
        int d = 0; //击落的数量

        String[] boatArray = S.split("\\,");
        String[] hitPosArray = T.split("\\ ");
        ArrayList<String> hitPosList = new ArrayList<String>();
        for(int i=0;i<hitPosArray.length;i++){
            hitPosList.add(hitPosArray[i]);
        }

        for(int i = 0; i < boatArray.length; i++){
            String[] boatPos = boatArray[i].split("\\ ");
            if(boatPos.length != 2){
                return "boat " + i + " position error";
            }
            String leftTop = boatPos[0];
            String rightBottom = boatPos[1];

            if(leftTop.length() != 2) return "boat " + i + "leftTop error";
            if(rightBottom.length() != 2) return "boat " + i + "rightBottom error";

            char left = leftTop.charAt(0);
            char top = leftTop.charAt(1);
            char right = rightBottom.charAt(0);
            char bottom = rightBottom.charAt(1);

            ArrayList<String> tmp = new ArrayList<String>();
            for(int j=left;j<=right;j++){
                for(int k=top;k<=bottom;k++){
                    tmp.add((char)j + "" + (char)k);
                }
            }

            int num =0;
            for(int j=0;j<tmp.size();j++){
                if(!hitPosList.contains(tmp.get(j))){
                    num++;
                }
            }

            if(num == 0){
                d++;
            }else{
                x++;
            }
        }

        return d+","+x;
    }

qq_19857675
qq_19857675 大神 谢谢你,我早上采纳答案的时候采纳错了,我重新提了一个问,您能把这个答案发过去,我把分加给您
大约 3 年之前 回复

你的横坐标是1-N,纵坐标只有26的英文字母,左右还是有点问题的。不知道26个字母之后,是怎样的逻辑。这里给一个26地图。你可以看看。

 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();
        }

    }
}

希望对你有帮助!

qq_19857675
qq_19857675 大神 谢谢你,我早上采纳答案的时候采纳错了,我重新提了一个问,您能把这个答案发过去,我把分加给您
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问