Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package problemsolve;
- import java.util.Iterator;
- import java.util.LinkedList;
- import java.util.Queue;
- public class Knight2 {
- public static Integer checkDirection(Integer CurrentX, Integer CurrentY,Integer targetX,Integer targetY) {
- if(CurrentX == targetX && CurrentY == targetY){
- return 0;
- }
- else if (CurrentX < targetX && CurrentY != targetY) {
- if (CurrentY < targetY) {
- return 1; // goto Right up Node (x+1,y+2) , (x+2,y+1)
- } else {
- return 2; // goto Right Down Node (x+1,y-2) , (x+2,y-1)
- }
- } else if (CurrentX == targetX) {
- if (CurrentY < targetY) {
- return 3; // go up Right and Left Node (x+1,y+2) , (x+2,y+1) , (x-1,y+2) , (x-2,y+1)
- } else {
- return 4; // go down Right and left Node (x+1,y-2) , (x+2,y-1) , (x-2,y-1) , (x-1,y-2)
- }
- } else if (CurrentX > targetX && CurrentY != targetY) {
- if (CurrentY < targetY) {
- return 5; // goto Left up Node (x-1,y+2) , (x-2,y+1)
- } else {
- return 6; // goto Left Down Node (x-2,y-1) , (x-1,y-2)
- }
- } else if (CurrentY == targetY) {
- if (CurrentX < targetX) {
- return 7; // goto Right up&down Node (x+1,y+2) , (x+2,y+1) , (x+1,y-2) , (x+2,y-1)
- } else {
- return 8; // goto Left up&down Node (x-1,y+2) , (x-2,y+1) , (x-2,y-1) , (x-1,y-2)
- }
- }
- return 0;
- }
- static void BFS(int startX, int startY, chessNode[][] chessPanel, int size,int tx,int ty) {
- LinkedList queue = new LinkedList();
- chessNode Currentnode = null, nextNode = null;
- Currentnode = new chessNode(startX, startY, false, 0, false); // Create Start Node
- queue.addLast(Currentnode);
- int step = 0;
- while (!queue.isEmpty()) { // no out if not Found
- Currentnode = (chessNode) queue.removeFirst(); // Remove From Queue To Check
- if (Currentnode.isTarget()) { // w00t!! w00t!! Found
- System.out.println();
- break;
- }
- int direction = checkDirection(Currentnode.getX(), Currentnode.getY(), tx, ty);
- switch (direction) {
- case 1:
- int x = Currentnode.getX() + 2;
- int y = Currentnode.getY() + 1;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() + 1;
- y = Currentnode.getY() + 2;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- break;
- case 2:
- x = Currentnode.getX() + 2;
- y = Currentnode.getY() - 1;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() + 1;
- y = Currentnode.getY() - 2;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- break;
- case 3:
- x = Currentnode.getX() - 2;
- y = Currentnode.getY() + 1;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() - 1;
- y = Currentnode.getY() + 2;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() + 2;
- y = Currentnode.getY() + 1;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() + 1;
- y = Currentnode.getY() + 2;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- break;
- case 4:
- x = Currentnode.getX() - 1;
- y = Currentnode.getY() - 2;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() - 1;
- y = Currentnode.getY() - 2;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() + 2;
- y = Currentnode.getY() - 1;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() + 1;
- y = Currentnode.getY() - 2;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- break;
- case 5:
- x = Currentnode.getX() - 2;
- y = Currentnode.getY() + 1;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() - 1;
- y = Currentnode.getY() + 2;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- break;
- case 6:
- x = Currentnode.getX() - 2;
- y = Currentnode.getY() - 1;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() - 1;
- y = Currentnode.getY() - 2;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- break;
- case 7:
- x = Currentnode.getX() + 2;
- y = Currentnode.getY() - 1;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() + 1;
- y = Currentnode.getY() - 2;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() + 2;
- y = Currentnode.getY() + 1;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() + 1;
- y = Currentnode.getY() + 2;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- break;
- case 8:
- x = Currentnode.getX() + 2;
- y = Currentnode.getY() - 1;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() - 1;
- y = Currentnode.getY() - 2;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() - 2;
- y = Currentnode.getY() + 1;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- x = Currentnode.getX() - 1;
- y = Currentnode.getY() + 2;
- step = Currentnode.getStep();
- if (x >= 0 && x < size && y >= 0 && y < size) {
- if (chessPanel[x][y] == null) {
- chessPanel[x][y] = new chessNode(x, y, false, 0, false);
- }
- nextNode = chessPanel[x][y];
- if (!nextNode.isVisited()) {
- nextNode.setVisited(true);
- nextNode.setStep(step + 1);
- queue.addLast(nextNode);
- }
- }
- break;
- default:
- }
- }
- }
- public static void main(String[] args) {
- int size = 5000; // array
- int startX = 2000;
- int startY = 3000;
- int endX = 1000;
- int endY = 600;
- chessNode[][] chessPanel = new chessNode[size][size]; // Set Buffer Size
- chessPanel[endX][endY] = new chessNode(endX, endY, false, 0, true); // Set Target Node
- BFS(startX, startY, chessPanel, size,endX,endY);
- System.out.println(chessPanel[endX][endY].getStep());
- }
- }
- /*
- 0|0 startX < targetX == go right
- 0 | 0 starty == targety == go up and down
- ----x-T-- 4 node to travel
- 0 | 0
- 0|0
- 0|1
- 0 | 1
- ----V-T--
- 0 | 1
- 0|1
- 0|1
- 0 | 1
- ----V-2-- Found
- 0 | 1
- 0|1
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement