Member 13366135 Ответов: 1

Почему он всегда печатает "нет пути"


package shortestpath;
import java.util.LinkedList;
import java.util.Scanner;
public class ShortestPath {
public int[] dx = {0,-1};
public int[] dy = {1, 0};
public static int[][] maze = new int[10][10];
public int n;
public int m;
public int[][] dist = new int[10][10];
public boolean valid(int i, int j)
{
	return i >= 0 && i < n && j >= 0 && j < m && maze[i][j] == 1;
}
public int bfs(Pair<Integer,Integer> source,Pair<Integer,Integer> destination)
{
	for (int i = 0 ; i < 10 ; i++)
	{
		for (int j = 0 ; j < 10 ; j++)
		{
			dist[i][j] = (int) 1e9;
		}
	}
            LinkedList<pair> q = new LinkedList<pair>();
        q.add(source);
	dist[source.first][source.second] = 0;
	while (!q.isEmpty())
	{
		Pair<Integer,Integer> cur = q.get(q.size()-1);
		q.pop();
		if (cur.first == destination.first && cur.second == destination.second)
		{
			return dist[cur.first][cur.second];
		}
		for (int i = 0 ; i < 2 ; i++)
		{
			int newi = dx[i] + cur.first;
			int newj = dy[i] + cur.second;
			if (valid(newi,newj))
			{
				if (dist[newi][newj] > dist[cur.first][cur.second] + 1)
                    		{
    					dist[newi][newj] = dist[cur.first][cur.second] + 1;
                                        Pair<Integer,Integer> x = new Pair<>(newi,newj);
					q.push(x);
				}
    			}
		}
	}
	return -1;
}
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);  
System.out.println("Enter the size of the maze");
        int n=sc.nextInt();  
        System.out.println("Enter the maze");
        int m=sc.nextInt();  
	for (int i = 0 ; i < n ; i++)
	{
		for (int j = 0 ; j < m ; j++)
		{
			 maze[i][j] = sc.nextInt();  
		}
	}
	Pair<Integer,Integer> source = new Pair<Integer,Integer>();
	Pair<Integer,Integer> dest = new Pair<Integer,Integer>();
        System.out.println("Enter the source");
	source.first = sc.nextInt();
	source.second = sc.nextInt();
                System.out.println("Enter the destination");
	dest.first = sc.nextInt();
	dest.second = sc.nextInt();
	int x = new ShortestPath().bfs(source, dest);
	if (x == -1)
	{
       	System.out.print("No Path\n ");
	}
	else
	{
	System.out.print("you can go from source to destination by move ");
        System.out.print(x);
	System.out.print(" moves\n");
	}
    }   
}


Что я уже пробовал:

я перепробовал все, но не могу определить, где ошибка.
я думаю это здесь
public int bfs(Pair<Integer,Integer> source,Pair<Integer,Integer> destination)
{
	for (int i = 0 ; i < 10 ; i++)
	{
		for (int j = 0 ; j < 10 ; j++)
		{
			dist[i][j] = (int) 1e9;
		}
	}
            LinkedList<pair> q = new LinkedList<pair>();
        q.add(source);
	dist[source.first][source.second] = 0;
	while (!q.isEmpty())
	{
		Pair<Integer,Integer> cur = q.get(q.size()-1);
		q.pop();
		if (cur.first == destination.first && cur.second == destination.second)
		{
			return dist[cur.first][cur.second];
		}
		for (int i = 0 ; i < 2 ; i++)
		{
			int newi = dx[i] + cur.first;
			int newj = dy[i] + cur.second;
			if (valid(newi,newj))
			{
				if (dist[newi][newj] > dist[cur.first][cur.second] + 1)
                    		{
    					dist[newi][newj] = dist[cur.first][cur.second] + 1;
                                        Pair<Integer,Integer> x = new Pair<>(newi,newj);
					q.push(x);
				}
    			}
		}
	}
	return -1;
}

Richard MacCutchan

Пожалуйста, правильно отформатируйте свой код и более четко объясните, что это за ошибка и где она возникает.

ZurdoDev

Потому что x всегда равно отрицательному 1. Чтобы узнать почему, отладьте свой код.

Patrice T

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

1 Ответов

Рейтинг:
2

Patrice T

Цитата:
Почему он всегда печатает "нет пути"

Потому что в вашем коде есть ошибка.
Лучше всего получить простой набор данных и наблюдать, как ваш код работает на отладчике, когда ваш код начинает делать неожиданные вещи, вы близки к ошибке.
-----
Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик-Википедия, свободная энциклопедия[^]
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.