Java-бот спасает вызов принцессы

Принцесса Пич заперта в одном из четырех углов квадратной сетки. Вы находитесь в центре сетки и можете двигаться по одному шагу за раз в любом из четырех направлений. Вы можете спасти принцессу?

Формат ввода

Первая строка содержит нечетное целое число N (3 <= N < 100), обозначающее размер сетки. Затем следует сетка NxN. Каждая ячейка обозначается как "-" (значение ascii: 45). Положение бота обозначено как "m", а положение принцессы - как "p".

Сетка индексируется с использованием Matrix Convention

Выходной формат

Распечатайте шаги, которые вы предпримете, чтобы спасти принцессу за один раз. Ходы должны быть разделены символом \ n, новой строкой. Допустимые ходы - ВЛЕВО, ВПРАВО, Вверх или ВНИЗ.

Вот мой код:

package challenges;

import java.util.*;

public class Solution {
static void displayPathtoPrincess(int n, int p,String [][] grid){
int botRow=0,botCol=0;

for(int r=0;r<n;r++){
   for (int c = 0; c < grid.length; c++) {
        if(grid[r][c].equals('m')) {
            botRow=r;
            botCol=c;
            continue;
        }
   }
        if(grid[0][0].equals('P')) {
            while(botRow>0) {
                botRow--;
                System.out.println("UP\n");
            }
            while(botCol>0) {
                botCol--;
                System.out.println("LEFT\n");
            }
        }
        else if(grid[0][p-1].equals('P')) {
            while(botRow>0) {
                System.out.println("UP\n");
                botRow--;
            }
            while(botCol<p-1) {
                botCol++;
                System.out.println("RIGHT\n");
            }
        }
        else if(grid[n-1][0].equals('P')) {
            while(botRow<n-1) {
                botRow++;
                System.out.println("DOWN\n");
            }
            while(botCol>0) {
                botCol--;
                System.out.println("LEFT\n");
            }
        }
        else if(grid[n-1][p-1].equals('P')) {
            while(botRow<n-1) {
                botRow++;
                System.out.println("DOWN\n");
            }
            while(botCol<p-1) {
                botCol++;
                System.out.println("RIGHT\n");
            }
        }   
   }
}
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int m,n;
    m = in.nextInt();
    n=m;
    int j=0;
    String grid[][] = new String[m][n];
    for(int i = 0; i < m; i++) {
       while(j<n){
            grid[i][j] = in.next();             
        j++;
       }     
    }

displayPathtoPrincess(m,n,grid);

}
}

Это дает Null Pointer Exception. Может кто-нибудь сказать, что я здесь делаю неправильно?

5 ответов

Решение

Хорошо, без обид, но этот код - беспорядок.

Я знаю, что я отвечу не совсем то, что вы хотите, но это может быть очень полезно для вас в будущем.

Что бы я изменил? (После того, как вы все это измените, ошибка, скорее всего, станет очевидной или станет достаточно ясной, чтобы обратиться за помощью)

Первый: типы переменных.

Это всего лишь маленькая деталь, но мне не нравится, как ты это сделал; зачем использовать String, если каждая ячейка будет представлена ​​символом?

Каждый раз, когда вы создаете переменную (или массив, или что-то вообще), думайте о том, что вам нужно для хранения, и создавайте переменную так, чтобы она сохраняла то, что вам нужно. Если вам нужно, чтобы он хранил значения true или false, вы не создавали бы строковую переменную и не сохраняли бы "true" или "false", вы бы использовали логическое значение.

Примените это каждый раз, и вы станете лучше.

Второе: используйте функции.

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

Я имею в виду, вы можете легко увидеть разницу между чем-то вроде вашего кода, и что-то вроде:

static void displayPathtoPrincess(int n, int p,char [][] grid){

    Point bot;
    Point princess;

    getInitialPositions(bot, princess, grid);

    Point dif = getRelativePrincessPosition(bot, princess);

    while (!bot.equals(princess)) {
        switch (dif.y) {
            case UP:
                move (UP_MOVEMENT);
                break;
            case DOWN:
                move (DOWN_MOVEMENT);
                break;
        }
        switch (dif.x) {
            case LEFT:
                move(LEFT_MOVEMENT);
                break;
            case RIGHT:
                move(RIGHT_MOVEMENT);
                break;
        }
    }
}

(А затем реализуйте необходимые методы и создайте константы, это довольно легко сделать)

В-третьих: используйте соответствующий цикл каждый раз.

Если вы знаете, что хотите перейти от j = 0, тогда как j то время, это называется для. (Также, как кто-то прокомментировал в своем ответе, вы забыли перезапустить j; так что это происходит только один раз.

Напоследок: поехали с вашей ошибкой сейчас.

Я полагаю, что ваш код может быть довольно глючным и не даст вам желаемого результата, но NullPointerException - это нечто более конкретное.

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

Когда вы пытаетесь прочитать значение, которое вы не указали (в том месте, где вы находите позицию робота), это значение равно нулю, а значение для некоторых строк также будет равно нулю; следовательно, NullPointerException (потому что вы пытаетесь получить доступ к значению нулевого массива).

Попробуйте это решение:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Solution
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int m = Integer.parseInt(br.readLine());

        char grid[][] = new char[m][m];
        for(int i = 0; i < m; i++)
        {
            String line = br.readLine();
            grid[i] = (line.trim()).toCharArray();
        }

        displayPathtoPrincess(m, grid);
    }

    static void displayPathtoPrincess(int m, char[][] grid)
    {
        int botRow = 0, botCol = 0, princessRow = 0, princessCol = 0;

        // Get bot and princess coordinates
        for (int r = 0; r < m; r++)
        {
            for (int c = 0; c < grid.length; c++)
            {
                if (grid[r][c] == 'm' || grid[r][c] == 'M')
                {
                    botRow = r;
                    botCol = c;
                }
                else if (grid[r][c] == 'p' || grid[r][c] == 'P')
                {
                    princessRow = r;
                    princessCol = c;
                }
            }
        }

        // Move the bot up or down till bot reaches same row
        if( princessRow < botRow )
        {
            while(botRow != princessRow)
            {
                botRow--;
                System.out.println("UP");
            }
        }
        else if( princessRow > botRow )
        {
            while(botRow != princessRow)
            {
                botRow++;
                System.out.println("DOWN");
            }
        }

        // Move the bot left or right till bot reaches same column
        if( princessCol < botCol )
        {
            while(botCol != princessCol)
            {
                botCol--;
                System.out.println("LEFT");
            }
        }
        else if( princessCol > botCol )
        {
            while(botCol != princessCol)
            {
                botCol++;
                System.out.println("RIGHT");
            }
        }

    }
}

Вот решение..

import java.util.*;

public class Solution {
static void displayPathtoPrincess(int n, int p, String[][] grid) {
    int botRow = 0, botCol = 0;

    for (int r = 0; r < n; r++) {
        for (int c = 0; c < grid.length; c++) {
            if (grid[r][c].equalsIgnoreCase("m")) {
                botRow = r;
                botCol = c;
            }
        }
        if (grid[0][0].equalsIgnoreCase("P")) {
            while (botRow > 0) {
                botRow--;
                System.out.println("UP\n");
            }
            while (botCol > 0) {
                botCol--;
                System.out.println("LEFT\n");
            }
        } else if (grid[0][p - 1].equalsIgnoreCase("P")) {
            while (botRow > 0) {
                botRow--;
                System.out.println("UP\n");
            }
            while (botCol < p - 2) {
                botCol++;
                System.out.println("RIGHT\n");
            }
        } else if (grid[n - 1][0].equalsIgnoreCase("P")) {
            while (botRow < n - 2) {
                botRow++;
                System.out.println("DOWN\n");
            }
            while (botCol > 0) {
                botCol--;
                System.out.println("LEFT\n");
            }
        } else if (grid[n - 1][p - 1].equalsIgnoreCase("P")) {
            while (botRow < n - 2) {
                botRow++;
                System.out.println("DOWN\n");
            }
            while (botCol < p - 2) {
                botCol++;
                System.out.println("RIGHT\n");
            }
        }
    }
}
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int m,n;
    m = in.nextInt();

    int j;
    String grid[][] = new String[m][m];
    for(int i = 0; i < m; i++) {

       for(j=0;j<m;j++){
            grid[i][j] = in.next();             

       }     
    }

displayPathtoPrincess(m,m,grid);

}
}

Принимая ввод, вы должны делать J =0 каждый раз, когда вы выходите из цикла, как

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int m,n;
    m = in.nextInt();
    n=m;
    int j=0;
    String grid[][] = new String[m][n];
    for(int i = 0; i < m; i++) {
       j = 0;
       while(j<n){
            grid[i][j] = in.next();             
        j++;
       }     
    }

я остаюсь 0 из-за этой ошибки. Вы должны поставить заявление на печать, чтобы проверить, почему вы получаете ошибку.

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

static void nextMove(int n, int r, int c, String  [] grid){

int xcord=0;
int ycord=0;
for ( int i = 0 ; i <n-1; i++){
    String s = grid[i];
    xcord=i;
    for(int x =0; x<=n-1;x++){
        if(s.charAt(x)=='p'){
            ycord=x;
            
            if(xcord==r){
                if(ycord>c){System.out.println("RIGHT");return;}
                else {System.out.println("LEFT");return;}
                
            }else if(xcord<r){System.out.println("UP");return;}
           
            else{ System.out.println("DOWN");return;}
              
            
        }
        
        
    }
  

 }

 System.out.println(xcord);
System.out.println(ycord);
}

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n,r,c;
    n = in.nextInt();
    r = in.nextInt();
    c = in.nextInt();
    in.useDelimiter("\n");
    String grid[] = new String[n];


    for(int i = 0; i < n; i++) {
        grid[i] = in.next();
    }

  nextMove(n,r,c,grid);

  }
}

Возможно, вы захотите взглянуть на следующий код в Java:

импорт java.util.Scanner;

Public Class Solution {

/*
 * 
 */
static void printPath(int n, String moves) {
    for (int i = n / 2; i >= 0; i -= 2) {
        System.out.println(moves);
    }           
}

/*
 * 
 */
static void displayPathtoPrincess(int n, String [] grid){

    // **** princess @ top left  ****

    if (grid[0].substring(0, 1).equals("p")) {
        printPath(n, "UP\nLEFT");
    }

    // **** princess @ top right ****

    else if (grid[0].substring(n - 1, n).equals("p") ) {
        printPath(n, "UP\nRIGHT");
    }

    // **** princess @ bottom right ****

    else if (grid[n - 1].substring(n - 1, n).equals("p")) {
        printPath(n, "DOWN\nRIGHT");
    }

    // **** princess @ bottom left ****

    else {
        printPath(n, "DOWN\nLEFT");
    }
}

/*
 * Test code
 */
public static void main(String[] args) {

    Scanner in = new Scanner(System.in);
    int m;
    m = in.nextInt();
    String grid[] = new String[m];

    for(int i = 0; i < m; i++) {
        grid[i] = in.next();
    }

    // **** ****

    in.close();

    // **** ****

    displayPathtoPrincess(m,grid);
}

}

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