迷宫算法
2017-08-19 11:08
204 查看
可以得出所有可行的路径
代码如下:
package Algorithm;
import java.util.LinkedList;
public class MiGong
{
public static void main(String[] args)
{
//0是可行的路径,1是墙壁,3是1起点,4是终点
int a[][]={
{1,1,1,1,1,1},
{3,0,0,0,0,1},
{1,0,1,1,0,1},
{1,0,1,1,0,1},
{1,0,0,0,0,1},
{1,0,1,1,0,1},
{1,0,1,1,0,1},
{1,0,0,0,0,4}
};
int ROW=a.length-1;
int COL=a[0].length-1;
LinkedList<LinkedList<String>> list=new LinkedList<LinkedList<String>>();//存放多条路径
LinkedList<String> list1=new LinkedList<String>();//存放临时的一条路径
list1.add("("+1+" "+0+")");
System.out.println(list1.get(0));
find(a,1,0,ROW,COL,list,list1);
System.out.println("可行的所有路径总数"+list.size());
for(LinkedList<String> listi:list)
{
for(String e:listi)
System.out.print(e);
System.out.println();
}
}
public static void find(int a[][],int x,int y,int ROW,int COL,LinkedList<LinkedList<String>> list,LinkedList<String> list1)
{
if(isOK(x+1,y,ROW,COL,a)&&!list1.contains("("+(x+1)+" "+y+")"))//下 未出界且未重复
{
LinkedList<String> temp=new LinkedList<String>();//创建临时的集合可以不需要return语句,也不用通过remove恢复到上一状态
for(String e:list1)
temp.add(e);
temp.add("("+(x+1)+" "+y+")");
if(a[x+1][y]==4)//找到终点
{
list.add(temp);
}
else find(a,x+1,y,ROW,COL,list,temp);//数字0 :表示是路
}
if(isOK(x-1,y,ROW,COL,a)&&!list1.contains("("+(x-1)+" "+y+")"))//上
{
LinkedList<String> temp=new LinkedList<String>();
for(String e:list1)
temp.add(e);
temp.add("("+(x-1)+" "+y+")");
if(a[x-1][y]==4)
{
list.add(temp);
}
else find(a,x-1,y,ROW,COL,list,temp);
}
if(isOK(x,y+1,ROW,COL,a)&&!list1.contains("("+x+" "+(y+1)+")"))//右
{
LinkedList<String> temp=new LinkedList<String>();
for(String e:list1)
temp.add(e);
temp.add("("+x+" "+(y+1)+")");
if(a[x][y+1]==4)
{
list.add(temp);
}
else find(a,x,y+1,ROW,COL,list,temp);
}
if(isOK(x,y-1,ROW,COL,a)&&!list1.contains("("+x+" "+(y-1)+")"))//左
{
LinkedList<String> temp=new LinkedList<String>();
for(String e:list1)
temp.add(e);
temp.add("("+x+" "+(y-1)+")");
if(a[x][y-1]==4)
{
list.add(temp);
}
else find(a,x,y-1,ROW,COL,list,temp);
}
}
public static boolean isOK(int x,int y,int ROW,int COL,int a[][])
{
if((x<=ROW&&x>=0&&y>=0&&y<=COL)&&(a[x][y]==0||a[x][y]==4))
return true;
else return false;
}
}
代码如下:
package Algorithm;
import java.util.LinkedList;
public class MiGong
{
public static void main(String[] args)
{
//0是可行的路径,1是墙壁,3是1起点,4是终点
int a[][]={
{1,1,1,1,1,1},
{3,0,0,0,0,1},
{1,0,1,1,0,1},
{1,0,1,1,0,1},
{1,0,0,0,0,1},
{1,0,1,1,0,1},
{1,0,1,1,0,1},
{1,0,0,0,0,4}
};
int ROW=a.length-1;
int COL=a[0].length-1;
LinkedList<LinkedList<String>> list=new LinkedList<LinkedList<String>>();//存放多条路径
LinkedList<String> list1=new LinkedList<String>();//存放临时的一条路径
list1.add("("+1+" "+0+")");
System.out.println(list1.get(0));
find(a,1,0,ROW,COL,list,list1);
System.out.println("可行的所有路径总数"+list.size());
for(LinkedList<String> listi:list)
{
for(String e:listi)
System.out.print(e);
System.out.println();
}
}
public static void find(int a[][],int x,int y,int ROW,int COL,LinkedList<LinkedList<String>> list,LinkedList<String> list1)
{
if(isOK(x+1,y,ROW,COL,a)&&!list1.contains("("+(x+1)+" "+y+")"))//下 未出界且未重复
{
LinkedList<String> temp=new LinkedList<String>();//创建临时的集合可以不需要return语句,也不用通过remove恢复到上一状态
for(String e:list1)
temp.add(e);
temp.add("("+(x+1)+" "+y+")");
if(a[x+1][y]==4)//找到终点
{
list.add(temp);
}
else find(a,x+1,y,ROW,COL,list,temp);//数字0 :表示是路
}
if(isOK(x-1,y,ROW,COL,a)&&!list1.contains("("+(x-1)+" "+y+")"))//上
{
LinkedList<String> temp=new LinkedList<String>();
for(String e:list1)
temp.add(e);
temp.add("("+(x-1)+" "+y+")");
if(a[x-1][y]==4)
{
list.add(temp);
}
else find(a,x-1,y,ROW,COL,list,temp);
}
if(isOK(x,y+1,ROW,COL,a)&&!list1.contains("("+x+" "+(y+1)+")"))//右
{
LinkedList<String> temp=new LinkedList<String>();
for(String e:list1)
temp.add(e);
temp.add("("+x+" "+(y+1)+")");
if(a[x][y+1]==4)
{
list.add(temp);
}
else find(a,x,y+1,ROW,COL,list,temp);
}
if(isOK(x,y-1,ROW,COL,a)&&!list1.contains("("+x+" "+(y-1)+")"))//左
{
LinkedList<String> temp=new LinkedList<String>();
for(String e:list1)
temp.add(e);
temp.add("("+x+" "+(y-1)+")");
if(a[x][y-1]==4)
{
list.add(temp);
}
else find(a,x,y-1,ROW,COL,list,temp);
}
}
public static boolean isOK(int x,int y,int ROW,int COL,int a[][])
{
if((x<=ROW&&x>=0&&y>=0&&y<=COL)&&(a[x][y]==0||a[x][y]==4))
return true;
else return false;
}
}
相关文章推荐
- C++广度优先搜索算法之迷宫问题
- C++广度优先搜索算法之走迷宫
- 算法提高 学霸的迷宫
- 算法竞赛-走迷宫
- 算法提高 学霸的迷宫
- codeup 1742: 算法3-3:迷宫
- 不太规则的迷宫生成算法2
- 算法提高 学霸的迷宫 (题解)
- [算法]广度优先求迷宫是否有出口,可用于求连通区域的数目
- 算法提高 学霸的迷宫
- 求解迷宫算法 迭代法
- 不相交类集算法生成迷宫并求解路径
- 算法之迷宫问题
- 蓝桥杯 算法提高 学霸的迷宫(简单bfs+记录路径)
- 重温经典的迷宫算法实现---栈的使用
- 算法提高 学霸的迷宫
- 华为迷宫算法c++完整实现
- php实现的生成迷宫与迷宫寻址算法完整实例
- C#三大迷宫生成算法
- 迷宫问题算法分析