Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.*;
- import java.util.stream.IntStream;
- public class Board {
- public static void main(String args[]) {
- String text = "100 100\n" +
- "2 100 50 50";
- text = "3 3\n" +
- "1 1 3 3";
- //Scanner scanner = new Scanner(text);
- Scanner scanner = new Scanner(System.in);
- int rows = scanner.nextInt();
- int columns = scanner.nextInt();
- scanner.nextLine();
- // Minus one for all because we iterate starting from 0
- int x1 = scanner.nextInt() - 1;
- int y1 = scanner.nextInt() - 1;
- int x2 = scanner.nextInt() - 1;
- int y2 = scanner.nextInt() - 1;
- /**
- * https://en.wikipedia.org/wiki/Knight%27s_graph
- * https://www.geeksforgeeks.org/minimum-steps-reach-target-knight/
- * */
- Integer elements[] = new Integer[(rows + 1) * (columns + 1)];
- IntStream.range(0, elements.length).forEach(i -> elements[i] = i);
- //System.out.print(Arrays.toString(elements));
- Graph<Integer> graph = new Graph<>((rows + 1) * (columns + 1), elements);
- for (int i = 0; i < rows; i++) {
- for (int j = 0; j < columns; j++) {
- if (i + 2 < rows&&j + 1 < columns) {
- graph.addEdge(transform(i, j, columns), transform(i + 2, j + 1, columns));
- }
- if (i + 2 < rows && j - 1 >= 0) {
- graph.addEdge(transform(i, j, columns), transform(i + 2, j - 1, columns));
- }
- if (i - 2 >= 0 && j + 1 < columns) {
- graph.addEdge(transform(i, j, columns), transform(i - 2, j + 1, columns));
- }
- if (i - 2 >= 0 && j - 1 >= 0) {
- graph.addEdge(transform(i, j, columns), transform(i - 2, j - 1, columns));
- }
- if (j + 2 < columns && i + 1 < rows) {
- graph.addEdge(transform(i, j, columns), transform(j + 2, i + 1, columns));
- }
- if (j + 2 < columns && i - 1 >= 0) {
- graph.addEdge(transform(i, j, columns), transform(j + 2, i - 1, columns));
- }
- if (j - 2 >= 0 && i + 1 < rows) {
- graph.addEdge(transform(i, j, columns), transform(j - 2, i + 1, columns));
- }
- if (j - 2 >= 0 && i - 1 >= 0) {
- graph.addEdge(transform(i, j, columns), transform(j - 2, i - 1, columns));
- }
- }
- }
- int from = transform(x1, y1, columns);
- int to = transform(x2, y2, columns);
- //int steps = bfsSearch(graph, from, to);
- int steps = graph.bfs(from, to);
- System.out.println(steps);
- }
- public static int transform(int i, int j, int n) {
- return i * n + j;
- }
- public static int bfsSearch(Graph<Integer> g, int from, int to) {
- Queue<Integer> nodes = new LinkedList<>();
- Queue<Integer> steps = new LinkedList<>();
- HashSet<Integer> visited = new HashSet<>();
- nodes.add(from);
- steps.add(0);
- while (!nodes.isEmpty()) {
- int c = nodes.poll();
- int st = steps.poll();
- if (visited.contains(c)) {
- continue;
- }
- visited.add(c);
- if (c == to) {
- return st;
- }
- GraphNode<Integer> current = g.adjList[c];
- for (GraphNode<Integer> neighbor : current.getNeighbors()) {
- nodes.add(neighbor.getIndex());
- steps.add(st + 1);
- }
- }
- return -1;
- }
- public static <T> void printMatrix(T matrix[][]) {
- System.out.println("Main.");
- Arrays.stream(matrix)
- .map(Arrays::toString)
- .forEach(System.out::println);
- }
- public static boolean isInside(int x, int y, int N) {
- if (x >= 1 && x <= N && y >= 1 && y <= N) return true;
- return false;
- }
- public static int minStepToReachTarget(int knightPos[], int targetPos[], int N) {
- // x and y direction, where a knight can move
- int dx[] = {-2, -1, 1, 2, -2, -1, 1, 2};
- int dy[] = {-1, -2, -2, -1, 1, 2, 2, 1};
- // queue for storing states of knight in board
- Queue<Cell> queue = new LinkedList<>();
- // push starting position of knight with 0 distance
- queue.add(new Cell(knightPos[0], knightPos[1], 0));
- Cell t;
- int x, y;
- boolean visited[][] = new boolean[N + 1][N + 1];
- // make all cell unvisited
- for (int i = 1; i <= N; i++)
- for (int j = 1; j <= N; j++)
- visited[i][j] = false;
- // visit starting state
- visited[knightPos[0]][knightPos[1]] = true;
- // loop until we have one element in queue
- while (!queue.isEmpty()) {
- t = queue.poll();
- visited[t.x][t.y] = true;
- // if current cell is equal to target cell,
- // return its distance
- if (t.x == targetPos[0] && t.y == targetPos[1])
- return t.dis;
- // loop for all reachable states
- for (int i = 0; i < dx.length; i++) {
- x = t.x + dx[i];
- y = t.y + dy[i];
- // If rechable state is not yet visited and
- // inside board, push that state into queue
- if (isInside(x, y, N) && !visited[x][y])
- queue.add(new Cell(x, y, t.dis + 1));
- }
- }
- return -1;
- }
- }
- class GraphNode<E> {
- private int index;//index (reden broj) na temeto vo grafot
- private E info;
- private LinkedList<GraphNode<E>> neighbors;
- public GraphNode(int index, E info) {
- this.index = index;
- this.info = info;
- neighbors = new LinkedList<GraphNode<E>>();
- }
- boolean containsNeighbor(GraphNode<E> o) {
- return neighbors.contains(o);
- }
- void addNeighbor(GraphNode<E> o) {
- neighbors.add(o);
- }
- void removeNeighbor(GraphNode<E> o) {
- if (neighbors.contains(o))
- neighbors.remove(o);
- }
- @Override
- public String toString() {
- String ret = "INFO:" + info + " SOSEDI:";
- for (int i = 0; i < neighbors.size(); i++)
- ret += neighbors.get(i).info + " ";
- return ret;
- }
- @Override
- public boolean equals(Object obj) {
- @SuppressWarnings("unchecked")
- GraphNode<E> pom = (GraphNode<E>) obj;
- return (pom.info.equals(this.info));
- }
- public int getIndex() {
- return index;
- }
- public void setIndex(int index) {
- this.index = index;
- }
- public E getInfo() {
- return info;
- }
- public void setInfo(E info) {
- this.info = info;
- }
- public LinkedList<GraphNode<E>> getNeighbors() {
- return neighbors;
- }
- public void setNeighbors(LinkedList<GraphNode<E>> neighbors) {
- this.neighbors = neighbors;
- }
- }
- class Graph<E> {
- int num_nodes;
- GraphNode<E> adjList[];
- @SuppressWarnings("unchecked")
- public Graph(int num_nodes, E[] list) {
- this.num_nodes = num_nodes;
- adjList = (GraphNode<E>[]) new GraphNode[num_nodes];
- for (int i = 0; i < num_nodes; i++)
- adjList[i] = new GraphNode<E>(i, list[i]);
- }
- @SuppressWarnings("unchecked")
- public Graph(int num_nodes) {
- this.num_nodes = num_nodes;
- adjList = (GraphNode<E>[]) new GraphNode[num_nodes];
- for (int i = 0; i < num_nodes; i++)
- adjList[i] = new GraphNode<E>(i, null);
- }
- int adjacent(int x, int y) {
- // proveruva dali ima vrska od jazelot so
- // indeks x do jazelot so indeks y
- return (adjList[x].containsNeighbor(adjList[y])) ? 1 : 0;
- }
- void addEdge(int x, int y) {
- // dodava vrska od jazelot so indeks x do jazelot so indeks y
- if (!adjList[x].containsNeighbor(adjList[y])) {
- adjList[x].addNeighbor(adjList[y]);
- }
- }
- void deleteEdge(int x, int y) {
- adjList[x].removeNeighbor(adjList[y]);
- }
- /************************TOPOLOGICAL SORT*******************************************************************/
- void dfsVisit(Stack<Integer> s, int i, boolean[] visited) {
- if (!visited[i]) {
- visited[i] = true;
- Iterator<GraphNode<E>> it = adjList[i].getNeighbors().iterator();
- System.out.println("dfsVisit: " + i + " Stack=" + s);
- while (it.hasNext()) {
- dfsVisit(s, it.next().getIndex(), visited);
- }
- s.push(i);
- System.out.println("--dfsVisit: " + i + " Stack=" + s);
- }
- }
- void topological_sort_dfs() {
- boolean visited[] = new boolean[num_nodes];
- for (int i = 0; i < num_nodes; i++) {
- visited[i] = false;
- }
- Stack<Integer> s = new Stack<Integer>();
- for (int i = 0; i < num_nodes; i++) {
- dfsVisit(s, i, visited);
- }
- System.out.println("----Stack=" + s);
- while (!s.isEmpty()) {
- System.out.println(adjList[s.pop()]);
- }
- }
- /***********************************************************************************************************/
- int bfs(int node, int to) {
- // visited array filled with false
- boolean visited[] = new boolean[num_nodes];
- for (int i = 0; i < num_nodes; i++)
- visited[i] = false;
- // mark start as true
- visited[node] = true;
- // print it
- //System.out.println(node + ": " + adjList[node].getInfo());
- // enqueue the start
- Queue<Integer> queue = new LinkedList<>();
- queue.add(node);
- GraphNode<E> rearmost;
- Queue<Integer> level = new LinkedList<>();
- level.add(0);
- while (!queue.isEmpty()) {
- // dequeue the rear-most
- rearmost = adjList[queue.poll()];
- GraphNode<E> neighbor = null;
- int currentLevel = level.poll();
- // for all of its neighbors
- for (int i = 0; i < rearmost.getNeighbors().size(); i++) {
- neighbor = rearmost.getNeighbors().get(i);
- // find the first neighbor that isn't visited
- if (!visited[neighbor.getIndex()]) {
- // mark it as visited
- visited[neighbor.getIndex()] = true;
- //System.out.println(neighbor.getIndex() + ": " + neighbor.getInfo());
- // enqueue that neighbor
- queue.add(neighbor.getIndex());
- level.add(currentLevel + 1);
- if (neighbor.getIndex() == to)
- return currentLevel + 1;
- }
- }
- }
- return -1;
- }
- @Override
- public String toString() {
- String ret = new String();
- for (int i = 0; i < this.num_nodes; i++)
- ret += i + ": " + adjList[i] + "\n";
- return ret;
- }
- }
- class Cell {
- Integer x;
- Integer y;
- Integer dis;
- public Cell(Integer x, Integer y, Integer dis) {
- this.x = x;
- this.y = y;
- this.dis = dis;
- }
- }
- /**
- * Дадена е една шаховска табла mxn и на неа е даден една шаховска фигура - коњ поставен во некое поле (x,y) на таблата. Коњот на шаховската табла легално во еден потег може да се движи или за две позиции вертикално и една хоризонтално или за две позиции хоризонтално и една вертикално, т.е. од позиција (x,y) може да се движи на една од следните позиции (x±1,y±2) или (x±2,y±1) (види слика). Да се најде минималниот број на потези за коњот да се придвижи од едно дадено почетно поле до едно дадено крајно поле на таблата.
- * <p>
- * enter image description here
- * <p>
- * Влез: Во првиот ред од влезот се дадени бројот на редици и колони на таблата (5<=m,n<=100), а во вториот ред се дадени полињата на почетокот и крајот на движењето на коњот (x1,y1) и (x2,y2) .
- * <p>
- * Излез: Да се испечати минималниот број на потези за коњот да се придвижи од едно дадено почетно поле до едно дадено крајно поле на таблата.
- * <p>
- * Делумно решение: Задачата се смета за делумно решена доколку се поминати 4 тест примери.
- * <p>
- * Пример:
- * <p>
- * Влез:
- * <p>
- * 5 5
- * <p>
- * 1 2 4 3
- * <p>
- * Излез:
- * <p>
- * 2
- * <p>
- * За да коњот се придвижи од позиција (1,2) до позиција (4,3) на шаховска табла 5x5 потребни се минимум 2 потега.
- * <p>
- * Име на класа (Јава): Board
- */
Advertisement
Add Comment
Please, Sign In to add comment