生活随笔
收集整理的這篇文章主要介紹了
杭电1180java实现(bfs)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
詭異的樓梯:
多組數據輸入M N,表示大小然后輸入地圖。*表示墻壁,’.‘表示可以通過,S初始,T結尾位置,‘-’,‘|’代表初始樓梯狀況,每隔一秒就會換成對方。-左右走,跳過樓梯,|上下走,跳過樓梯(相當于走兩格)
分析:
1:首先要確定上下 和左右的參數設置,不能搞混,我選擇a[x][y],x代表上下(行)
2:找到時間最短的點,說明是bfs,并且為了防止爆內存,還要標記走過的路,樓梯不標記,標記過的位置不在走。用的隊列還要用優先隊列優化
3:難點是’-'和‘|’的處理。因為每秒都會變一次,所以可以要看時間,time%2=0;表示遇到的就是原始的樓梯,time%2=1,代表遇到的是相反的樓梯。
4:難點2就是停留的問題,普通的路是不會停留的,只有遇到樓梯才可能停留,這就是遇到的樓梯過不去的狀況,就要判斷過去會不會越界,過去的那個點是否已經走過。只有滿足條件,對面的點沒去過,才會等一次。
附上代碼:
import java
.util
.Comparator
;
import java
.util
.PriorityQueue
;
import java
.util
.Queue
;
import java
.util
.Scanner
;public class 杭電
1180 {static int x
[]={0,1,0,-1};static int y
[]={1,0,-1,0};static int m
,n
; static int x1
=0,y1
=0,x2
=0,y2
=0;static char a
[][]=new char[20][20];public static void main(String
[] args
) {Scanner sc
=new Scanner(System
.in
); while(sc
.hasNext()){ m
=sc
.nextInt();n
=sc
.nextInt();sc
.nextLine(); boolean b
[][]=new boolean[m
][n
];for(int i
=0;i q1
=new PriorityQueue(timecomepare2
); q1
.add(new zuobiao(x1
,y1
,0));while(!q1
.isEmpty()){zuobiao zuo
=q1
.poll();int x3
=zuo
.x
;int y3
=zuo
.y
; if(x3
==x2
&&y3
==y2
) {System
.out
.println(zuo
.time
);break;}else for(int i
=0;i
<4;i
){ if(x3 x
[i
]=0&&y3 y
[i
]=0&&!b
[x3 x
[i
]][y3 y
[i
]]) { if(a
[x3 x
[i
]][y3 y
[i
]]=='.'){b
[x3 x
[i
]][y3 y
[i
]]=true;q1
.add(new zuobiao(x3 x
[i
],y3 y
[i
],zuo
.time
1)); }if(a
[x3 x
[i
]][y3 y
[i
]]=='|'){if(zuo
.time
%2==1&&(i
==0||i
==2)){if(y3 y
[i
] y
[i
]=0){ b
[x3 x
[i
] x
[i
]][y3 y
[i
] y
[i
]]=true;q1
.add(new zuobiao(x3 x
[i
] x
[i
],y3 y
[i
] y
[i
],zuo
.time
1));}}else if(zuo
.time
%2==0&&(i
==1||i
==3)){if(x3 x
[i
] x
[i
]=0){ b
[x3 x
[i
] x
[i
]][y3 y
[i
] y
[i
]]=true; q1
.add(new zuobiao(x3 x
[i
] x
[i
],y3 y
[i
] y
[i
],zuo
.time
1));} } else if(y3 y
[i
] y
[i
]=0&&x3 x
[i
] x
[i
]=0) {if(b
[x3 x
[i
] x
[i
]][y3 y
[i
] y
[i
]]==false)q1
.add(new zuobiao(x3
,y3
,zuo
.time
1));}}if(a
[x3 x
[i
]][y3 y
[i
]]=='-'){if(zuo
.time
%2==1&&(i
==1||i
==3)){if(x3 x
[i
] x
[i
]=0){ b
[x3 x
[i
] x
[i
]][y3 y
[i
] y
[i
]]=true; q1
.add(new zuobiao(x3 x
[i
] x
[i
],y3 y
[i
] y
[i
],zuo
.time
1));}}else if(zuo
.time
%2==0&&(i
==0||i
==2)){if(y3 y
[i
] y
[i
]=0){ b
[x3 x
[i
] x
[i
]][y3 y
[i
] y
[i
]]=true; q1
.add(new zuobiao(x3 x
[i
] x
[i
],y3 y
[i
] y
[i
],zuo
.time
1));}} else if(y3 y
[i
] y
[i
]=0&&x3 x
[i
] x
[i
]=0){if(b
[x3 x
[i
] x
[i
]][y3 y
[i
] y
[i
]]==false)q1
.add(new zuobiao(x3
,y3
,zuo
.time
1));}}if (a
[x3 x
[i
]][y3 y
[i
]]=='T'){ b
[x3 x
[i
]][y3 y
[i
]]=true;q1
.add(new zuobiao(x3 x
[i
],y3 y
[i
],zuo
.time
1));} }} } }
public static Comparator timecomepare2
=new Comparator()
{public int compare(zuobiao a1
,zuobiao a2
){return (int)(a1
.time
-a2
.time
);}};
}class zuobiao
{ int x
;int y
;int time
; public zuobiao(int x
,int y
,int time
){this.x
=x
;this.y
=y
;this.time
=time
; }
}
總結
以上是生活随笔為你收集整理的杭电1180java实现(bfs)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。