0

我很绝望,我需要你的帮助!我正在研究一个填字游戏求解器,其中给出了谜题和单词,我们需要格式化谜题,以便数组中的每个索引都有自己的字母。现在我有拼图索引拆分和单词拆分所以我可以进去逐个字母比较它们但是有更好的方法吗?比方说,是否有可能有一个包含我要查找的单词的字符串数组,并有一个字符数组来定位该单词?

    My array looks like this: 
    [W, V, E, R, T, I, C, A, L, L]
    [R, O, O, A, F, F, L, S, A, B]
    [A, C, R, I, L, I, A, T, O, A]
    [N, D, O, D, K, O, N, W, D, C]
    [D, R, K, E, S, O, O, D, D, K]
    [O, E, E, P, Z, E, G, L, I, W]
    [M, S, I, I, H, O, A, E, R, A]
    [A, L, R, K, R, R, I, R, E, R]
    [K, O, D, I, D, E, D, R, C, D]
    [H, E, L, W, S, L, E, U, T, H]

假设我正在寻找“垂直”。如何设置一个循环来查找构成字符串“垂直”的字符。还是我必须逐字比较?

这是我的代码:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;


public class WordSearch {

    public static void main(String[] args) throws Exception{
            File file = new File("puzzle.txt"); 
            Scanner sc = new Scanner(file);
        int row = sc.nextInt();
        int col = sc.nextInt();
        sc.nextLine();

        //Make an array to hold the puzzle
        char[][] puzzle = new char[row][col];   


         //Read in the strings from the file into the array.
        for (int i=0; i<row; i++){
            String getChar = (new String(sc.next()));
            for(int j = 0;j<col; j++){
                puzzle[i][j] = getChar.charAt(j);
                }
            }

        //Test Print
         for (int i=0; i<puzzle.length; i++){

               System.out.print(Arrays.toString(puzzle[i]));
               System.out.println("");
         }



        //Read the number of words and move to the next line    
        int numwords = sc.nextInt();
        sc.nextLine();

        //Make an array to hold the words and read in the words from a file
        String[] words = new String[numwords];
        for(int i=0; i<numwords; i++){
            words[i] = sc.nextLine();
        }

        //look for each word
        for(int i=0; i<numwords; i++){
            String currentword = words[i];      

            String[] strings1 = currentword.split("");

            int range = currentword.length()+1;

            String[] strings2 = Arrays.copyOfRange(strings1, 1, range);

            int range2 = strings2.length;
            char[] charwords = new char[range2];    





            }



    //Close the scanner     
    sc.close();
    }

    }

这是否可以测试对角线:

private boolean checkDiagonals(int row, int col, String word, char[][] puzzle) {
        //Checking diagonals direction
        for(int letter = 1; letter < word.length(); letter++) {
            if(puzzle[row + letter][col + letter] != word.charAt(letter)) {
                return false;
            }
            else if(puzzle[row + letter][col - letter] != word.charAt(letter)) {
                return false;
            }
            else if(puzzle[row - letter][col - letter] != word.charAt(letter)) {
                return false;
            }
            else if(puzzle[row - letter][col + letter] != word.charAt(letter)) {
                return false;
            }
        }
        return true;
    }
4

3 回答 3

1

比方说,是否有可能有一个包含我要查找的单词的字符串数组,并有一个字符数组来定位该单词?

是的,只需做

从字符串数组中获取元素,如

  String arrayElem = str[i]; // i is index.

这给了你一个字符串。

然后

  boolean result=Arrays.equals(arrayElem.toCharArray(), actualCharArray);
于 2013-10-01T14:42:30.287 回答
1

因为这些词可以是任何方向,所以简单地逐个字母会更有意义。在整个字符数组中搜索您要查找的单词的第一个字母。例如,如果您要查找“VERTICAL”,您将遍历整个数组以查找字母“V”。

然后有一个函数可以验证所有方向(上、下、左、右、对角线)的单词。让我们称之为check(int row, int col)

for(int row = 0; row < puzzle.length; row++) {
    for(int col = 0; col < puzzle[0].length; col++) {
        if(puzzle[row][col] == word.charAt(0))
            if(check(row, col) == true)
                    //We found it.
    }
}

然后要写check(int row, int col, String word, char[][] puzzle),您将检查每个基本方向,例如,如果您检查正确,您将继续向右并将字母与单词进行比较,直到您匹配单词,或者发现不一致。然后,如果没有方向有效,则返回 false。

举个例子,这里是右边的检查(在我们不在数组的情况下没有错误检查,你想要实现它)。

private boolean checkRight(int row, int col, String word, char[][] puzzle) {
    //Checking right direction
    for(int letter = 1; letter < word.length(); letter++) {
        if(puzzle[row][col + letter] != word.charAt(letter)) {
            return false;
        }
    }
    return true;
}

然后,您需要为每个方向使用其中一个,然后在您的检查功能中,它看起来像

public boolean check(int row, int col, String word, char[][] puzzle) {
    if(checkRight(row, col, word, puzzle)) return true;
    if(checkLeft(row, col, word, puzzle)) return true;
    if(checkUp(row, col, word, puzzle)) return true;
    if(checkDown(row, col, word, puzzle)) return true;
    if(checkDiagonals(row, col, word, puzzle)) return true;
    return false;
}
于 2013-10-01T14:59:50.330 回答
-1

我建议将数组中的每一行转换为Stringthen use String.indexOf()。这将确定您要查找的字符串是否存在于行中以及它开始的位置。如果你回来-1,你会知道该行中不存在该字符串。

String.indexOf()

于 2013-10-01T14:44:29.450 回答