import java.util.ArrayList;
public class Robt {
private Position position = null;
private ArrayList<Position> route = new ArrayList<Position>();
private int[][] map = null;
private int[][] dead=new int[Constant.WIDTH][Constant.HIGHT];
private int[][] fourDire=new int[Constant.WIDTH][Constant.HIGHT];
private boolean flag1 = true;
boolean isOk = false;
public int[][] getDead() {
return dead;
}
public ArrayList<Position> getRoute() {
return route;
}
public Robt(int[][] map) {
this.map = map;
position = new Position(0, 0);
}
public void run() {
while (flag1) {
while(flag1&&fourDire[position.getI()][position.getJ()]<4){
while (flag1&&position.getI()+1<Constant.HIGHT) {
if (!goDown(position)) {// false
break;
}
}
while (flag1&&position.getJ()+1<Constant.WIDTH) {
if (!goRight(position)) {// false
break;
}
}
while (flag1&&position.getI()-1>=0) {
if (!goUP(position)) {// false
break;
}
}
while (flag1&&position.getJ()-1>=0) {
if (!goLeft(position)) {// false
break;
}
}
}
dead[position.getI()][position.getJ()]=1;//is dead block
// four direction is over ,put out last stack element
if(!flag1){
return;
}
if (route.size() > 0) {
position = route.get(route.size() - 1);
route.remove(route.size() - 1);
} else {
flag1 = false;
System.out.println("no way");
isOk = false;
}
}
}
public void exam() {
// int d = position.getPreDir();
// boolean f=validate(position.getPreDir(), position.getI(),
// position.getJ());
// while(!f){
// f = validate(position.getPreDir(), position.getI(), position.getJ());
// }
}
private void isOut(int x, int y) {
if (x == (Constant.WIDTH-1) && y == (Constant.HIGHT-1)) {
flag1 = false;
System.out.println("out");
isOk = true;
}
}
private boolean goDown(Position p) {
int i = p.getI();
int j = p.getJ();
fourDire[i][j]+=1;
if(dead[i+1][j]==1){return false;}
if (isLastStackElement(i+1, j)) {
return false;
}// last stack element
if (i + 1 < Constant.HIGHT && map[i][j] != 1 && map[i + 1][j] != 4) {
route.add(new Position(i, j,Constant.DOWN));
isOut(i + 1, j);// is out ?
position.setI(i + 1);
position.setJ(j);
// System.out.println((i+1)+","+j+",d");
return true;
}
return false;
}
private boolean goRight(Position p) {
int i = p.getI();
int j = p.getJ();
fourDire[i][j]+=1;
if(dead[i][j+1]==1){return false;}
if (isLastStackElement(i, j+1)) {
return false;
}// last stack element
if ((j + 1) < Constant.WIDTH && map[i][j] != 2 && map[i][j + 1] != 3) {
route.add(new Position(i, j,Constant.RIGHT));
isOut(i, j + 1);
position.setI(i);
position.setJ(j + 1);
// System.out.println(i+","+(j+1)+",r");
return true;
}
return false;
}
private boolean goLeft(Position p) {
int i = p.getI();
int j = p.getJ();
fourDire[i][j]+=1;
if(dead[i][j-1]==1){return false;}
if (isLastStackElement(i, j-1)) {
return false;
}// last stack element
if ((j - 1) >= 0 && map[i][j] != 3 && map[i][j - 1] != 2) {
route.add(new Position(i, j,Constant.LEFT));
isOut(i, j - 1);
position.setI(i);
position.setJ(j - 1);
// System.out.println(i+","+(j-1)+",l");
return true;
}
return false;
}
private boolean goUP(Position p) {
int i = p.getI();
int j = p.getJ();
fourDire[i][j]+=1;
if(dead[i-1][j]==1){return false;}
if (isLastStackElement(i-1, j)) {
return false;
}// last stack element
if ((i - 1) >= 0 && map[i][j] != 4 && map[i - 1][j] != 1) {
route.add(new Position(i, j,Constant.UP));
isOut(i-1, j);
position.setI(i-1);
position.setJ(j);
// System.out.println((i-1)+","+j+",u");
return true;
}
return false;
}
private boolean isLastStackElement(int i, int j) {
for(int c=0;c<route.size();c++){
if (route.size()>0&&route.get(c).getI() == i
&& route.get(c).getJ() == j) {
return true;
}// stack element
}
return false;
}
}
class Position {
private int i = -1;
private int j = -1;
private int direction = -1;
public Position(int i, int j){
this.i = i;
this.j = j;
}
public Position(int i, int j,int d) {
this.i = i;
this.j = j;
this.direction = d;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public int getJ() {
return j;
}
public void setJ(int j) {
this.j = j;
}
public int getDirection() {
return direction;
}
public void setDirection(int direction) {
this.direction = direction;
}
}