Продолжаю выходить за пределы в моем рекурсивном методе навигации и нахождения всех комбинаций букв в матрице 4X4

Это часть решения Boggle. Я сделал рекурсивный метод, чтобы пройти через матрицу строк. MyLetteres хранятся все символы (например, a, b, c...), MyLetteres1 инициализируется как пустой, и tracker это к false, Эти переменные отмечают, какие координаты в матрице, которую я уже посетил (я не могу вернуться к координатам). Я могу двигаться только к соседним координатам (не могу пропустить). Параметр String word инициализируется одной буквой (отправная точка). int x а также int y мои (х, у) координаты. игнорировать int p а также int n,

У меня проблемы с тем, что я не могу правильно обозначить координаты, которые метод уже прошел, и тогда я не могу сбросить tracker (последняя строка) false для следующего getPaths() бежать.

Вот мой код, пожалуйста, помогите!

public void getPaths(int p, int n,int x, int y,String word, boolean tracker[][],boolean MyLetteres1[][],String MyLetteres[][],boolean checker)throws IOException{
    if(word.length()>1)
        checker=Check(word);//Check() just checks to see if its a word.
    tracker[x][y]=true;//makes sure that the checkers never goes back over starting letter
    if(x+1<MyLetteres.length&&tracker[x+1][y]==false){//up{
        //checker=Check(word);//checks to see if its word 
        //reverse(word);
        System.out.print("1 ("+x+","+y+"), ");//for debugging purposes
        getPaths(n,p,x+1, y,word+MyLetteres[x+1][y], tracker,MyLetteres1,MyLetteres,true);//recursive part
    }
    if(x-1>0&&tracker[x-1][y]==false){//down
        //checker=Check(word);
        //reverse(word);
        System.out.print("2 ("+x+","+y+"), ");
        getPaths(n,p,x-1, y ,word+MyLetteres[x-1][y], tracker,MyLetteres1,MyLetteres,true);
    }
    if(y+1<MyLetteres.length&&tracker[x][y+1]==false){//right
        //checker=Check(word);
        //reverse(word);
        System.out.print("3 ("+x+","+y+"), ");
        getPaths(n, p,x , y+1,word+MyLetteres[x][y+1], tracker,MyLetteres1,MyLetteres,true);
    }
    if(y-1>0&&tracker[x][y-1]==false){//left
        //checker=Check(word);
        //reverse(word);
        System.out.print("4 ("+x+","+y+"), ");
        getPaths(n,p,x , y-1,word+MyLetteres[x][y-1], tracker,MyLetteres1,MyLetteres,true);
    }
    if(x+1<MyLetteres.length&&y+1<MyLetteres.length&&tracker[x+1][y+1]==false){//right, up
        //checker=Check(word);
        //reverse(word);
        System.out.print("5 ("+x+","+y+"), ");
        getPaths(n,p,x+1, y+1,word+MyLetteres[x+1][y+1], tracker,MyLetteres1,MyLetteres,true);
    }
    if(x-1>0&&y-1>0&&tracker[x-1][y-1]==false){//down, left
        //checker=Check(word);
        //reverse(word);
        System.out.print("6 ("+x+","+y+"), ");
        getPaths(n,p,x-1, y-1,word+MyLetteres[x-1][y-1], tracker,MyLetteres1,MyLetteres,true);
    }
    if(x-1>0&&y+1<MyLetteres.length&&tracker[x-1][y+1]==false){//down, right
        //checker=Check(word);
        //reverse(word);
        System.out.print("7 ("+x+","+y+"), ");
        getPaths(n,p,x+1, y-1, word+MyLetteres[x-1][y+1],tracker,MyLetteres1,MyLetteres,true);
    }
    if(x+1<MyLetteres.length&&y-1>0&&tracker[x+1][y-1]==false){//up, left
        //checker=Check(word);
        //reverse(word);
        System.out.print("8 ("+x+","+y+"), ");
        getPaths(n, p,x-1 , y+1, word+MyLetteres[x+1][y-1],tracker,MyLetteres1,MyLetteres,true);
    }
    tracker=deepCopyBoolean(MyLetteres1);//MyLetteres1 never changes so this is my attempt at resetting tracker (which does change) back to all false so that when the program starts a new path, nothing has been "visited".
 }

1 ответ

Есть много вещей, которые вы можете сделать, чтобы помочь нам или себе в этом. Самое главное, если вы выходите за пределы, вы должны знать, по какой линии это происходит. Ваш отладчик может сказать вам это, и сказать нам, что это очень поможет. Это также помогло бы сказать нам, на каком языке вы кодируете. Для меня это выглядит как Java.

В этом случае это выглядит как в ваших последних двух if заявления, вы передаете неправильно x а также y значения в getPaths. У тебя есть

if(x-1>0&&y+1... getPaths(n,p,x+1,y-1

а также

if(x+1<MyLetteres.length&&y-1>0...getPaths(n, p, x-1, y+1

Исправьте это, и вы, вероятно, исправите свое исключение вне диапазона.

Между прочим, когда вы проверяете свой диапазон, вы, вероятно, хотите проверить x >= 0 а также y >= 0 вместо x > 0 а также y > 0, Это верно для индекса массива, равного 0.

Кроме того, технически неточно проверять, x + 1 < MyLetteres.length и если y + 1 < MyLetteres.length, так как это говорит "на x + 1 меньше" высоты "доски" и "на y + 1 меньше" высоты "доски". Так как ваша доска квадратная, она работает нормально, но если быть точным, вы должны иметь x + 1 < MyLetteres[0].length, то есть способ сказать "на х + 1 меньше, чем" ширина "доски.

Наконец, что касается сброса трекера, я бы рекомендовал, чтобы он был нулевым, и передавал его как нулевой в вызове верхнего уровня. Если оно пустое, вы знаете, что находитесь в начале нового слова, и вы можете создать свое собственное и передать его во все последующие рекурсивные вызовы.

Удачи!

Другие вопросы по тегам