2013-09-14 3 views
0

У меня есть программа, которая должна искать «ruby», «python» и «java» в головоломке поиска слов. Мой профессор дал мне код для поиска слева направо, но я не уверен, как идти справа налево и по диагонали. Я видел, как другие люди кодируют одну и ту же проблему, но я думаю, что мой профессор хочет, чтобы я сделал это аналогичным методом, который она сделала.Поиск справа налево и по диагонали в поиске слов - Java

Я попытался перейти справа налево, но я либо получаю исключение из списка, либо поиск возвращается отрицательным.

public static void main (String[] argv) 
{ 
    char[][] puzzle = { 
     {'n', 'o', 'h', 't', 'y', 'p', 's'}, 
     {'m', 'i', 'a', 'r', 'y', 'c', 'c'}, 
     {'l', 'l', 'e', 'k', 's', 'a', 'h'}, 
     {'r', 'u', 'b', 'y', 'v', 'm', 'e'}, 
     {'e', 'h', 'h', 'a', 'l', 'l', 'm'}, 
     {'p', 'c', 'j', 'n', 'i', 'c', 'e'}, 
     {'r', 'e', 'e', 'k', 'b', 'i', 'p'} 
    }; 

    String result1 = findWordLefttoRight (puzzle, "ruby"); 
    String result2 = findWordRighttoLeft (puzzle, "python"); 
    //String result3 = findWordBottomLefttoTopRight (puzzle, "java"); 
    System.out.println (result1); 
    System.out.println (result2); 
    //System.out.println (result3); 
} 

/*Given by Professor*/ 

static String findWordLefttoRight (char[][] puzzle, String word) 
{ 
// First convert the String into a char array. 
char[] letters = word.toCharArray(); 

// Now try every possible starting point in the puzzle array. 
for (int i=0; i<puzzle.length; i++) { 
    for (int j=0; j<puzzle[i].length; j++) { 

    // Use (i,j) as the starting point. 
    boolean found = true; 

    // Try to find the given word's letters. 
    for (int k=0; k<letters.length; k++) { 
     if ((j+k >= puzzle[i].length) || (letters[k] != puzzle[i][j+k])) { 
     // Not a match. 
     found = false; 
     break; 
     } 
    } 

    // If we went the whole length of the word, we found it. 
    if (found) { 
     return "String " + word + " found in row=" + i + " col=" +j; 
    } 

    } 
} 

return "String " + word + " not found"; 
} 

/* My attempt at going from right to left */ 

static String findWordRighttoLeft (char[][] puzzle, String word) 
{ 
// First convert the String into a char array. 
char[] letters = word.toCharArray(); 

// Now try every possible starting point in the puzzle array. 
for (int i=puzzle.length; i>0; i--) { 
    for (int j=puzzle.length; j>0; j--) { 

    // Use (i,j) as the starting point. 
    boolean found = true; 

    // Try to find the given word's letters. 
    for (int k=0; k<letters.length; k++) {   
     if ((j+k <= puzzle.length) || (letters[k] == puzzle[i][j+k])) { 
     // Not a match. 
     found = false; 
     break; 
     } 
    } 

    // If we went the whole length of the word, we found it. 
    if (found) { 
     return "String " + word + " found in row=" + i + " col=" +j; 
    } 

    } 
} 

return "String " + word + " not found"; 
} 
+1

Итак, в чем вопрос? – sashkello

+0

Для поиска справа налево по диагонали. – YazanLpizra

+0

Задача № 1: индексы массивов нумеруются от 0 до длины-1. Итак, для (int j = puzzle.length; j> 0; j--) должно быть для (int j = puzzle.length-1; j> = 0; j--). Могут быть и другие проблемы, но вам нужно сформулировать вопрос с конкретной проблемой, а не просить исправить свой код. – sashkello

ответ

0

Запишите вашу матрицу головоломки на листе бумаги (сетки бумаги, если у вас есть), и поставить индексы для каждой строки и столбца по размерам матрицы. Посмотрите на цикл вложенных циклов, который вы используете для поиска матрицы слева направо, которая начинается с комментария //Now try every possible starting point in the puzzle array и понимает, как она работает, чтобы искать матрицу, которую вы используете на бумаге. Затем посмотрите, как вы будете искать справа налево и решаете, как вы измените код, чтобы пересечь матрицу справа налево. Как только вы это решите, сделайте то же самое по диагонали. Помните, что по диагонали имеет четыре случая:

  1. Верхний левый правый нижний угол
  2. Нижняя слева вверху справа
  3. В правом верхнем углу на нижнем левом углу
  4. в нижнем правом углу верхнего левого

Для английского языка читателей, вероятно, более интуитивно, чем диалогично, рассматривать как случай №1, поэтому начните с этого, чтобы ваше понимание проблемы возрастало.

Для ошибок OutOfBounds добавьте операторы отладки в коде (или даже лучше, научитесь использовать отладчик IDE), чтобы вы могли понять, как работает цикл for, и где он заходит слишком далеко.

0

ниже условие будет вызывать из связанного исключения

(letters[k] != puzzle[i][j+k]) 

где

J max value can be puzzle[i].length and 
k max value can be letters.length 

, так как вы складывали их обоих и проверить, что индекс он вызывает исключение. Максимальное значение может быть только головоломкой [i] .length

Примечание: findWordLefttoRight логика также неверна, в том же выпуске exsist. это также вызовет исключение из исключения

Смежные вопросы