Java 验证战列舰板、2d阵列,如何检查板有效性的可能性?

Java 验证战列舰板、2d阵列,如何检查板有效性的可能性?,java,puzzle,Java,Puzzle,当给定一个带有1和0的2d数组时,用Java编写代码来验证战舰板,其中1是战舰的一部分,0是海。 以下是需要了解的规则: -必须有一艘战列舰(4个单元大小)、2艘巡洋舰(3个单元大小)、3艘驱逐舰(2个单元大小)和4艘潜艇(1个单元大小)。任何额外的船只以及失踪的船只都是不允许的 -每艘船都必须是一条直线,除了潜艇,它们只是一个单元 -船不能重叠,但可以与任何其他船接触。 我的方法只是计算2号、3号、4号船的所有可能连接,并确保它们大于所需大小的船的数量,这并不适用于所有情况,此外,我还将帮助检

当给定一个带有1和0的2d数组时,用Java编写代码来验证战舰板,其中1是战舰的一部分,0是海。 以下是需要了解的规则:

-必须有一艘战列舰(4个单元大小)、2艘巡洋舰(3个单元大小)、3艘驱逐舰(2个单元大小)和4艘潜艇(1个单元大小)。任何额外的船只以及失踪的船只都是不允许的

-每艘船都必须是一条直线,除了潜艇,它们只是一个单元

-船不能重叠,但可以与任何其他船接触。

我的方法只是计算2号、3号、4号船的所有可能连接,并确保它们大于所需大小的船的数量,这并不适用于所有情况,此外,我还将帮助检查是否有20个1的位置。问题是,如果我们有0 1 1 0 0 0 0 0 0 0 0 0,它将告诉我它是有效的,尽管它肯定不是(因为它是一排和一艘船),并且当我有以下内容时: 应该为false,但我的返回true->

  {0,0,0,0,0,0,0,1,1,0},
 {0,0,0,0,0,0,0,1,1,1},
 {0,0,0,0,0,0,1,1,1,0},
 {0,1,0,0,0,0,0,0,0,0},
 {0,1,0,0,1,1,1,0,0,0},
 {0,0,0,0,1,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,1,0,0,0,0,1,1,0},
 {0,0,1,0,0,0,0,1,1,0},
 {0,1,1,1,0,0,0,0,0,0},
 {0,0,0,1,1,1,0,0,0,0},
 {0,1,1,1,0,0,0,0,0,0},
 {0,0,0,1,1,1,0,0,0,0},
 {0,1,1,1,0,1,1,0,0,0},
 {0,1,0,0,0,0,1,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
或 应该为false,但我的返回true->

  {0,0,0,0,0,0,0,1,1,0},
 {0,0,0,0,0,0,0,1,1,1},
 {0,0,0,0,0,0,1,1,1,0},
 {0,1,0,0,0,0,0,0,0,0},
 {0,1,0,0,1,1,1,0,0,0},
 {0,0,0,0,1,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,1,0,0,0,0,1,1,0},
 {0,0,1,0,0,0,0,1,1,0},
 {0,1,1,1,0,0,0,0,0,0},
 {0,0,0,1,1,1,0,0,0,0},
 {0,1,1,1,0,0,0,0,0,0},
 {0,0,0,1,1,1,0,0,0,0},
 {0,1,1,1,0,1,1,0,0,0},
 {0,1,0,0,0,0,1,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
下面是一个示例,代码在返回true时起作用:

 {1,0,0,0,0,1,1,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,1,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
但当我举这个例子时:

{0,0,1,0,0,0,0,1,1,0},
 {0,1,1,0,0,0,0,0,0,0},
 {1,1,1,1,1,0,0,0,0,1},
 {0,0,1,1,1,1,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,1,1,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,1,0,0,1},
 {0,0,0,0,0,0,0,0,0,1},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
应该为false,但我的代码返回true。所以,我怎样才能找到一种方法来重组我的代码,或者找到一个解决方案,当我得到一个董事会时,我真的不知道它是否有效。但是我的Java程序会吗

这是我的代码,我尝试了这一点,我的方法是列出检查特定船舶的所有变化,从最大的到较小的(最大的是[4 3 2]不包括1,因为它会显著增加变化量,我可以用不同的方式更有效地检查它,最小的变化是[2 2 3 3 4]4最后重复它们的原因是因为2有x3船2 2 2,x2船3船3 3,x1船4船1)代码如下:

import java.util.*;

class Permute{
    public static List<int[]> l;
    Permute(){
        this.l=new ArrayList<int[]>();
    }
    static void permute(java.util.List<Integer> arr, int k){
        for(int i = k; i < arr.size(); i++){
            java.util.Collections.swap(arr, i, k);
            permute(arr, k+1);
            java.util.Collections.swap(arr, k, i);
        }
        if (k == arr.size() -1){
            l.add(arr.stream()
            .map(i -> (i == null ? 0 : i))
            .mapToInt(Integer::intValue)
            .toArray()); 
        }
    }
     public static List<int[]> get(){
        Permute.permute(java.util.Arrays.asList(2,2,2,3,3,4), 0);Collections.reverse(l);
        return l;
    }
}

public class BF {
    private static int[][] fields,copy;
    private static int[] ship= {0,0,3,2,1};
    public BF(int[][] field) {
        fields=field;
//        print(field);
        this.copy=field;
    }
    
    public boolean validate() {
        int cnt=counter(fields);
        if(cnt!=20)return false;
        Permute p= new Permute();//permutation constructor
        List<int[]> list=p.get();//gets our specific permution
        for (int i = 0; i < list.size(); i++) {//run through each option of our permution list
            copy=fields;
            ship=new int[]{0,0,3,2,1};//amount of ships needed
            boolean flag=check(fields,list.get(i));//checks if the permution variation is true or false
            int cnt1=counter(copy);//we checked boats of size 2 3 4 but not 1 which means if its valid then there should be 4 boats left
            if(flag && cnt1==4)return true;
        }
        return false;
    }
   public static boolean check(int[][] field,int[] ships){
           for(int i=0;i<ships.length;i++) {//go through the array and loop through the variation
                int num=getBoat(fields, ships[i]);//if the boat is true on the certain boat we are checking
                ship[num]--;//then -1 and at the end we want it to be [<=0,0,0,0,0]
           }
           int counter=0;
           for(int i=2;i<ship.length;i++) {
               if(ship[i]==0)counter++;//if [0,0,0]
           }
           if(counter==3) {return true;}//then return true
         return false;
    }

  public static int getBoat(int[][] field,int num) {
      int dire=0,r=0,c=0;String dir="row";
     for (int col = 0; col < fields[0].length; col++) {
        for (int row = 0; row < fields.length; row++) {//loop through each coordinate
            if (copy[row][col] == 1) {//check if its part of a boat at the coor
              int length=field.length;dir="row";dire=row;
               for(int j=0;j<2;j++) {//go horizontal then vertical
                   if(j==1) {length=field[0].length;dir="col";dire=col;}//change length to vertical
                    if(dire+num-1<length) {//make sure we don't get outofbounds error
                        int cnt=0;
                        for(int i=0;i<num;i++) {//checks each coor according to type of boat we are checking
                            if(dir.equals("row")) {r=row+i;c=col;}
                            else if(dir.equals("col")){r=row;c=col+i;}
                            if(copy[r][c]==1) {//check
                                cnt++;//copy of battle field becomes 0
                            }
                            else copy=fields;//otherwise break this loop since it is not relevant anymore on this coor
                            if(cnt==num) {
                                for(int k=0;k<num;k++) {
                                    if(dir.equals("row")) {r=row+k;c=col;}
                                    else if(dir.equals("col")){r=row;c=col+k;}
                                    copy[r][c]=0;//now we know its valid length and make it 0 on the copy
                                    }
                                    return cnt;
                        }}}} //if num is correct then return it
                }
        }
     }return 0;
     }
  public static int counter(int[][] f) {// counts amount of tiles on the board with 1's
      int cnt=0;
    for (int col = 0; col < f[0].length; col++) {
        for (int row = 0; row < f.length; row++) {
            if (f[row][col] == 1) {
             cnt++; 
            }
            }
    }
    return cnt;
  }
    public static void print(int[][] field) {//prints the board
        for (int row = 0; row < field.length; row++) {
            for (int col = 0; col < field[0].length; col++) {
                if(col<field[0].length-1 && col!=0) {
                    System.out.print( field[row][col]+",");
                }
                else if(col==field[0].length-1){
                    System.out.print( field[row][col]+"},");
                }
                else if(col==0) {
                    System.out.print(" {"+ field[row][col]+",");
                }
            }
            System.out.println("");
            }
  System.out.println("\n");
    }

}
在这里是正确的:

 {1,0,0,0,0,0,0,0,1,0},
 {0,0,1,0,0,1,1,1,1,0},
 {0,0,1,1,0,0,0,0,0,0},
 {0,0,1,1,1,1,1,0,0,0},
 {0,0,1,1,1,0,0,0,0,0},
 {0,0,1,0,1,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},

 {1,0,0,0,0,1,1,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {1,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {1,1,1,0,0,0,0,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {1,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,1,1,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,1,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
在这里是正确的:

 {1,0,0,0,0,0,0,0,1,0},
 {0,0,1,0,0,1,1,1,1,0},
 {0,0,1,1,0,0,0,0,0,0},
 {0,0,1,1,1,1,1,0,0,0},
 {0,0,1,1,1,0,0,0,0,0},
 {0,0,1,0,1,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},

 {1,0,0,0,0,1,1,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {1,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {1,1,1,0,0,0,0,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {1,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,1,1,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,1,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
在这里是正确的:

 {1,0,0,0,0,0,0,0,1,0},
 {0,0,1,0,0,1,1,1,1,0},
 {0,0,1,1,0,0,0,0,0,0},
 {0,0,1,1,1,1,1,0,0,0},
 {0,0,1,1,1,0,0,0,0,0},
 {0,0,1,0,1,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},

 {1,0,0,0,0,1,1,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {1,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {1,1,1,0,0,0,0,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {1,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,1,1,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,1,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
这里也是如此:

 {1,0,0,0,0,0,0,0,1,0},
 {0,0,1,0,0,1,1,1,1,0},
 {0,0,1,1,0,0,0,0,0,0},
 {0,0,1,1,1,1,1,0,0,0},
 {0,0,1,1,1,0,0,0,0,0},
 {0,0,1,0,1,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},

 {1,0,0,0,0,1,1,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {1,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {1,1,1,0,0,0,0,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {1,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,1,1,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,1,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
但在这些示例中,代码返回false

所以在这个例子中

 {1,1,1,0,0,0,0,0,0,0},
 {1,1,0,0,0,0,0,0,1,0},
 {1,1,0,0,1,1,1,0,1,0},
 {1,0,0,0,0,0,0,0,0,0},
 {1,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,1,1,1,0,0,0},
 {0,0,0,0,0,0,0,0,1,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
它之所以有效,是因为:

[![在此处输入图像描述][1][1]

但是我的代码采用大小的第一个选项,这就是我的代码返回为false的结果-

[![在此处输入图像描述][2][2]

那么我需要添加什么来解决这个问题呢

public class BF {
    private static int[][] fields;
    public BF(int[][] field) {
        fields=field;
        print(field);
        
    }
    public boolean validate() {
        int cnt=counter(fields);
        if(cnt!=20)return false;
        return checkBoard(fields, new int[]{4,3,3,2,2,2},0,new int[] {3,2,1});
    }


    public static boolean checkBoard(int[][] board,int[] SizePlacement,int k,int[] shipAmount){
       if (counter(board)==4 ) {
            return true;
        }
       int cnt=0;//SizePlacement={4,3,3,2,2,2}, ship(changes)={3,2,1}, k(starts at 0) is placement in ships[]
       for (int row = 0; row < board.length; row++) {
           for (int col = 0; col < board[0].length; col++) {
             if(board[row][col]==1 && row+SizePlacement[k]<board.length) {//vertically
               cnt=1;
               for(int i=1;i<SizePlacement[k];i++) {//check vertically
                   if(board[row+i][col]==1) {cnt++;}
                   }
               if(cnt>=SizePlacement[k]) {
                   int[][] newBoard = deepcopy(board);
                   newBoard= remove(newBoard , row, col, SizePlacement[k], "ver");
                   shipAmount[SizePlacement[k]-2]--;
                   if(shipAmount==new int[]{0,0,0}) {return true;}
                   if(k+1<SizePlacement.length && checkBoard(newBoard,SizePlacement,k+1,shipAmount)) {return true;}
                  shipAmount[SizePlacement[k]-2]++;   
               }
           }
            if(board[row][col]==1 && col+SizePlacement[k]<board[0].length) {//horizontally
               cnt=1;
               for(int i=1;i<SizePlacement[k];i++) {//check horizontally
                   if(board[row][col+i]==1) {cnt++;}
                   }
               if(cnt>=SizePlacement[k]) {
                  int[][] newBoard = deepcopy(board);
                  newBoard= remove(newBoard , row, col, SizePlacement[k], "hor");
                   shipAmount[SizePlacement[k]-2]--;
                   if(shipAmount==new int[]{0,0,0}) {return true;}
                   if(k+1<SizePlacement.length &&checkBoard(newBoard,SizePlacement,k+1,shipAmount)) {
                     return true;
                   }
                  shipAmount[SizePlacement[k]-2]++;
                   }
               }
           }
       }
       return false;
    }
   public static int[][] remove(int[][] newBoard,int row,int col,int size,String orien){
       int[][] removedBoard= deepcopy(newBoard);
       if(orien=="ver") {
           for(int i=0;i<size;i++) {
               removedBoard[row+i][col]=0;
           }
           print(removedBoard);
           return removedBoard;
       }
       else if(orien=="hor") {
           for(int i=0;i<size;i++) {
               removedBoard[row][col+i]=0;
           }
           print(removedBoard);
           return removedBoard;
       }
       return removedBoard;
   }
   public static int[][] deepcopy(int[][] fields){
    int[][] copy= new int[fields.length][fields[0].length];
    for (int row = 0; row < fields.length; row++) {
        for (int col = 0; col < fields[0].length; col++) {
                   copy[row][col]= fields[row][col];
               }
            }
    return copy;
   }
   public static int counter(int[][] f) {// counts amount of tiles on the board with 1's
          int cnt=0;
        for (int col = 0; col < f[0].length; col++) {
            for (int row = 0; row < f.length; row++) {
                if (f[row][col] == 1) {
                 cnt++; 
                }
                }
        }
        return cnt;
      }
        public static void print(int[][] field) {//prints the board
            for (int row = 0; row < field.length; row++) {
                for (int col = 0; col < field[0].length; col++) {
                    if(col<field[0].length-1 && col!=0) {
                        System.out.print( field[row][col]+",");
                    }
                    else if(col==field[0].length-1){
                        System.out.print( field[row][col]+"},");
                    }
                    else if(col==0) {
                        System.out.print(" {"+ field[row][col]+",");
                    }
                }
                System.out.println("");
                }
      System.out.println("\n");
        }
}
公共类BF{
私有静态int[][]字段;
公共BF(int[][]字段){
字段=字段;
打印(字段);
}
公共布尔验证(){
int cnt=计数器(字段);
如果(cnt!=20)返回false;
返回检查板(字段,新int[]{4,3,3,2,2},0,新int[]{3,2,1});
}
公共静态布尔检查板(int[]board,int[]sizeplace,int k,int[]shipmount){
if(计数器(板)==4){
返回true;
}
int cnt=0;//SizePlacement={4,3,3,2,2,2},ship(changes)={3,2,1},k(从0开始)是ships中的位置[]
对于(int row=0;row如果(board[row][col]==1&&row+SizePlacement[k]如果所有船舶的位置都有效,则board有效

这意味着您需要船舶的数据结构。首先,简单的数据结构可能是
[船舶类型,[位置1,位置2,位置3]]

一旦你有了船的数据结构,检查所有的船都在船上,没有两艘船共享一个位置,以及船上每种类型的船的正确数量是很简单的。每种类型的船的正确数量可以进入
舰队
数据结构

有了一艘船,你会很快意识到,知道舰队的一方的棋盘上可以显示他们船只的字母。但是另一个棋盘是“特殊”的,因为没有船只的可见性。这意味着(就像在真实的游戏中一样)战列舰由两种板组成,一种是命中检测板,一种是舰船定位板。它们看起来相似只是制造的副作用

现在,对于
命中板
来说,AI和AI将如何尝试追捕一艘船?好吧,他们将从随机放置或模式开始。这两种方法都有优势。一旦检测到命中,它将参考战场上剩余船只的数量,并开始沿水平轴和垂直轴进行探测,以找到目标船的全方位。一旦它被告知“你击沉了我的”它就会知道沉没的船必须从游戏中移除

 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,1,1,1,1,0,0},
 {0,0,0,0,1,1,1,1,0,0},
 {0,0,0,0,1,1,1,1,0,0},
 {0,0,0,0,1,1,1,1,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0},
由两艘战列舰、一艘驱逐舰、一艘潜艇和一艘巡洋舰组成。如果没有额外的信息,就不可能知道大多数战列舰是从左到右还是从上到下的

有时,甚至不可能在游戏发生时知道船的位置。有趣的是,这可能并不总是足够的信息来知道船的位置。有时,当船排成紧密的队形,你通过在一排或一列(或两者)内进行攻击来击沉船时,会发生这种情况已经注册命中的方块。在这种情况下,你的命中可能不会定义沉没物品的结尾

如果目标是在没有位置以外任何额外信息的情况下验证董事会,那么您需要采取不同的方法

  • 按大小订购船只
  • 在当前板位置内,重复此操作,直到没有可用的船舶
  • 选择最大的船
  • 搜索最大船舶的所有可能位置,生成没有船舶位置标记的新板
  • 如果无法放置船,则该板不是有效的板配置
  • 如果装运清单为空且板上有标记,则板不是有效的板配置
  • 如果