package bfspac;
class Queue{
public final int SIZE = 10000;
public int[] queArrayx;
public int[] queArrayy;
public int[] label;
public int[] pre_x=new int[SIZE];
public int[] pre_y=new int[SIZE];
public int frontx; //队头
public int rearx; //队尾
public int frontpre_x=0; //队头
public int rearpre_x=0; //队尾
public int frontpre_y=0; //队头
public int rearpre_y=0; //队尾
public int fronty; //队头
public int reary; //队尾
public int frontlabel; //队头
public int rearlabel; //队尾
public Queue()
{
queArrayx = new int[SIZE];;
queArrayy = new int[SIZE];
label=new int[SIZE];
frontx = 0 ;
fronty = 0 ;
rearx = 0;
reary = 0;
frontlabel=0; //队头
rearlabel=0; //队尾
}
public void insert(int x,int y,int flag)
{
queArrayx[rearx++] =x;
queArrayy[reary++] =y;
label[rearlabel++]=flag;
}
public void insertPre(int m,int n)
{
pre_x[rearpre_x++] =m;
pre_y[rearpre_y++] =n;
}
public int removex()
{
return queArrayx[frontx++];
}
public int removey()
{
return queArrayy[fronty++];
}
public int removelabel()
{
return label[frontlabel++];
}
public boolean isEmpty()
{
return (rearx==frontx);
}
}
public class V_BFS {
public static int shuzulength;
public static int[][] map={{0,0,0,0,1},{0,0,1,0,1},{0,0,1,0,0},{1,0,0,0,1},{1,0,0,1,0}};
public static int[] direx={-1,0,1,0};
public static int[] direy={0,1,0,-1};
public static int[][] allPathsNum=new int[5][5];
public static void BFS(int x,int y){
int steps=1;
map[x][y]=2;
allPathsNum[x][y]=1;
Queue myQueue=new Queue();
myQueue.insert(x,y,2);
myQueue.insertPre(-1, -1);
while(!myQueue.isEmpty()){
int curx=myQueue.removex();
int cury=myQueue.removey();
int temp=myQueue.removelabel()+1;
if(curx==3&&cury==3){
steps=temp-3;
System.out.println("steps="+steps);
break;
}
for(int i=0;i<4;i++){
int newx=curx+direx[i];
int newy=cury+direy[i];
if(newx>=0&&newx<shuzulength&&newy>=0&&newy<shuzulength&&map[newx][newy]==temp){
allPathsNum[newx][newy]=allPathsNum[newx][newy]+allPathsNum[curx][cury];
}
if(newx>=0&&newx<shuzulength&&newy>=0&&newy<shuzulength&&map[newx][newy]==0){
allPathsNum[newx][newy]=allPathsNum[newx][newy]+allPathsNum[curx][cury];
map[newx][newy]=temp;
myQueue.insert(newx, newy,temp);
myQueue.insertPre(curx,cury);
}
}
}
int zuixlength=steps-1;
int[] zuix=new int[zuixlength];
int[] zuiy=new int[zuixlength];
int tempx=3,tempy=3;
int temppc=zuixlength-1;
for(int i=0;i<myQueue.rearx;i++){/zuixlength=1
if(tempx==myQueue.queArrayx[i]&&tempy==myQueue.queArrayy[i])
{
zuix[temppc]=myQueue.pre_x[i];
zuiy[temppc]=myQueue.pre_y[i];
temppc--;
tempx=myQueue.pre_x[i];
tempy=myQueue.pre_y[i];
i=-1;
if(temppc==-1) break;
}
}
System.out.println("zuixlength=="+zuixlength);
System.out.print("(0,0)->");
for(int i=0;i<zuixlength;i++){
System.out.print("("+zuix[i]+","+zuiy[i]+")->");
}
System.out.print("(3,3)");
}
public static void main(String[] args){
shuzulength=map.length;
for(int i=0;i<shuzulength;i++){
for(int j=0;j<shuzulength;j++){
System.out.print(map[i][j]+" ");
}
System.out.println(" ");
}
System.out.println(" ");
BFS(0,0);
System.out.println(" ");
for(int k=0;k<shuzulength;k++){
for(int m=0;m<shuzulength;m++){
System.out.print(map[k][m]+" ");
}
System.out.println(" ");
}
System.out.println(" ");
for(int k=0;k<5;k++){
for(int m=0;m<5;m++){
System.out.print(allPathsNum[k][m]+" ");
}
System.out.println(" ");
}
System.out.println(" ");
System.out.println("allPathsNum="+allPathsNum[3][3]);
}
}