算法提高 学霸的迷宫
2017-05-22 19:54
246 查看
一道bfs题,但要有一个记录数组,进行优化
代码:
import java.util.ArrayList;
import java.util.Scanner;
public class LearnerMaze {
//x为行 y为列 visit[]用来标记之前经过的位置,防止重复加入队列
private static int n,m,maze[][],orientX[],orientY[],visit[][];
private static String bufori[];
private static ArrayList<LearnerNode> list;
private static LearnerNode myNode;
public static void main(String[] args) {
// TODO 自动生成的方法存根
int time=0;
list=new ArrayList<LearnerNode>();
Scanner read=new Scanner(System.in);
String str=read.nextLine();
String strr[]=str.split(" ");
n=Integer.valueOf(strr[0]);
m=Integer.valueOf(strr[1]);
maze=new int
[m];
visit=new int
[m];
while(time<n){
str=read.nextLine();
for(int i=0;i<m;i++){
maze[time][i]=Integer.valueOf(str.charAt(i)-48);
}
time++;
}
orientX=new int[]{-1,1,0,0};
orientY=new int[]{0,0,-1,1};
bufori=new String[]{"U","D","L","R"};
if(maze[1][0]==0){
LearnerNode node=new LearnerNode();
node.buf.append("D");
node.x=1;
node.y=0;
node.Opos=0;
list.add(node);
}
if(maze[0][1]==0){
LearnerNode node=new LearnerNode();
node.buf.append("R");
node.x=0;
node.y=1;
node.Opos=2;
list.add(node);
}
bfs();
System.out.println(myNode.buf.length());
System.out.println(myNode.buf);
read.close();
}
private static void bfs(){
LearnerNode node;
int a,b;
while(!list.isEmpty()){
node=list.get(0);
list.remove(0);
if(node.x==n-1&&node.y==m-1){
myNode=node;
return;
}
for(int i=0;i<4;i++){
if(i!=node.Opos){
a=node.x+orientX[i];
b=node.y+orientY[i];
if(a<n&&b<m&&a>=0&&b>=0){
if(maze[a][b]==0){
LearnerNode temp=new LearnerNode();
if(i==0){
temp.Opos=1;
}else if(i==1){
temp.Opos=0;
}else if(i==2){
temp.Opos=3;
}else if(i==3){
temp.Opos=2;
}
if(visit[a][b]==0){
temp.x=a;
temp.y=b;
temp.buf.append(node.buf+bufori[i]);
list.add(temp);
visit[a][b]=1;
}
}
}
}
}
}
}
}
class LearnerNode{
int Opos,x,y;
StringBuffer buf=new StringBuffer();
}
代码:
import java.util.ArrayList;
import java.util.Scanner;
public class LearnerMaze {
//x为行 y为列 visit[]用来标记之前经过的位置,防止重复加入队列
private static int n,m,maze[][],orientX[],orientY[],visit[][];
private static String bufori[];
private static ArrayList<LearnerNode> list;
private static LearnerNode myNode;
public static void main(String[] args) {
// TODO 自动生成的方法存根
int time=0;
list=new ArrayList<LearnerNode>();
Scanner read=new Scanner(System.in);
String str=read.nextLine();
String strr[]=str.split(" ");
n=Integer.valueOf(strr[0]);
m=Integer.valueOf(strr[1]);
maze=new int
[m];
visit=new int
[m];
while(time<n){
str=read.nextLine();
for(int i=0;i<m;i++){
maze[time][i]=Integer.valueOf(str.charAt(i)-48);
}
time++;
}
orientX=new int[]{-1,1,0,0};
orientY=new int[]{0,0,-1,1};
bufori=new String[]{"U","D","L","R"};
if(maze[1][0]==0){
LearnerNode node=new LearnerNode();
node.buf.append("D");
node.x=1;
node.y=0;
node.Opos=0;
list.add(node);
}
if(maze[0][1]==0){
LearnerNode node=new LearnerNode();
node.buf.append("R");
node.x=0;
node.y=1;
node.Opos=2;
list.add(node);
}
bfs();
System.out.println(myNode.buf.length());
System.out.println(myNode.buf);
read.close();
}
private static void bfs(){
LearnerNode node;
int a,b;
while(!list.isEmpty()){
node=list.get(0);
list.remove(0);
if(node.x==n-1&&node.y==m-1){
myNode=node;
return;
}
for(int i=0;i<4;i++){
if(i!=node.Opos){
a=node.x+orientX[i];
b=node.y+orientY[i];
if(a<n&&b<m&&a>=0&&b>=0){
if(maze[a][b]==0){
LearnerNode temp=new LearnerNode();
if(i==0){
temp.Opos=1;
}else if(i==1){
temp.Opos=0;
}else if(i==2){
temp.Opos=3;
}else if(i==3){
temp.Opos=2;
}
if(visit[a][b]==0){
temp.x=a;
temp.y=b;
temp.buf.append(node.buf+bufori[i]);
list.add(temp);
visit[a][b]=1;
}
}
}
}
}
}
}
}
class LearnerNode{
int Opos,x,y;
StringBuffer buf=new StringBuffer();
}
相关文章推荐
- 蓝桥杯算法提高 -- 学霸的迷宫
- 蓝桥杯 算法提高 学霸的迷宫 经典BFS问题
- 算法提高 学霸的迷宫
- 算法笔记_107:蓝桥杯练习 算法提高 学霸的迷宫(Java)
- 算法提高 学霸的迷宫
- 算法提高 学霸的迷宫
- 蓝桥网算法提高 学霸的迷宫
- 蓝桥杯-算法提高 学霸的迷宫(BFS-倒向追踪输出移动方向)
- 蓝桥杯_算法提高_学霸的迷宫(简单回溯法,没有减枝)
- 蓝桥杯 算法提高 学霸的迷宫
- 蓝桥杯练习系统试题集 算法提高 ADV-147 学霸的迷宫
- 算法提高 学霸的迷宫
- 算法提高 学霸的迷宫
- C++ - 蓝桥杯 - 算法提高 学霸的迷宫 (bfs+记录路径)
- 算法提高 学霸的迷宫 (题解)
- 算法提高 学霸的迷宫(蓝桥杯)
- 蓝桥杯 算法提高 学霸的迷宫 JAVA
- 算法提高 学霸的迷宫
- 算法提高 学霸的迷宫
- 算法提高 学霸的迷宫