当前位置:编程学习 > JAVA >>

老鼠做迷宫,显示出所有可走路径(求高手)

class Demo1
{
public static void init()
{
int a[][] = { { 2, 2, 2, 2, 2, 2, 2 }, { 2, 0, 0, 0, 0, 0, 2 },
{ 2, 0, 2, 0, 2, 0, 2 }, { 2, 0, 0, 2, 0, 2, 2 },
{ 2, 2, 0, 2, 0, 2, 2 }, { 2, 0, 0, 0, 0, 0, 2 },
{ 2, 2, 2, 2, 2, 2, 2 } };
for(int i=0;i<7;i++)
{
for(int j=0;j<7;j++)
{
if(a[i][j]==2)
System.out.print("██");
else if(a[i][j]==0)
System.out.print("  ");
}
System.out.println();
}
if(!judge(a,1,1))System.out.println("没有找到路径");
else
{
System.out.println("找到了路径");
for(int i=0;i<7;i++)
{
for(int j=0;j<7;j++)
{
if(a[i][j]==2)
System.out.print("██");
else if(a[i][j]==0)
System.out.print("  ");
else if(a[i][j]==1)
System.out.print("↓↓");
}
System.out.println();
}
}
}
static boolean flag=false;
public static boolean judge(int[][] a, int i, int j) {
int endi=5,endj=5;
a[i][j]=1;
if(i==endi&&j==endj)flag=true;
if(!flag&&a[i][j+1]==0)judge(a,i,j+1);
if(!flag&&a[i+1][j]==0)judge(a,i+1,j);
if(!flag&&a[i-1][j]==0)judge(a,i-1,j);
if(!flag&&a[i][j-1]==0)judge(a,i,j-1);
if(!flag)
{a[i][j]=0;
}
return flag;
}
public static void main(String args[])
{
init();
}
}
这是显示一条路径的代码,怎么实现找出所有的路径,谁能帮忙改一下,最好有代码 --------------------编程问答-------------------- 写错了,是老鼠走迷宫,谁会啊,讲讲思路也成 --------------------编程问答-------------------- 以前写过类似的C语言程序,思路大概是这样的:
定义一个栈也就是一个List吧,
定义一个类型,拥有上下左右四个方向的标志,表示是否可行(是否走过)。
没走一步都要判断四个方向有没有路可以走,就是标志位是否为true,如果有的就进栈,如果没有就出栈,如果到了最后一个指定的位置了,就直接输出栈里面的路径
对了,因为是要输出所有的路径,所以是要用递归的方法哈 --------------------编程问答-------------------- 深搜,暴力一下,即可。 --------------------编程问答-------------------- 百度 a*算法 --------------------编程问答--------------------
引用 2 楼  的回复:
以前写过类似的C语言程序,思路大概是这样的:
定义一个栈也就是一个List吧,
定义一个类型,拥有上下左右四个方向的标志,表示是否可行(是否走过)。
没走一步都要判断四个方向有没有路可以走,就是标志位是否为true,如果有的就进栈,如果没有就出栈,如果到了最后一个指定的位置了,就直接输出栈里面的路径
对了,因为是要输出所有的路径,所以是要用递归的方法哈

前面的大致能懂,这句话具体的代码怎么实现呢?(因为是要输出所有的路径,所以是要用递归的方法哈)
--------------------编程问答--------------------
引用 3 楼  的回复:
深搜,暴力一下,即可。
怎么实现啊 --------------------编程问答--------------------
引用 5 楼  的回复:
引用 2 楼 的回复:
以前写过类似的C语言程序,思路大概是这样的:
定义一个栈也就是一个List吧,
定义一个类型,拥有上下左右四个方向的标志,表示是否可行(是否走过)。
没走一步都要判断四个方向有没有路可以走,就是标志位是否为true,如果有的就进栈,如果没有就出栈,如果到了最后一个指定的位置了,就直接输出栈里面的路径
对了,因为是要输出所有的路径,所以是要用递归的方法哈

前面……


这是我以前写的一个C语言的迷宫算法,你参考下吧:
#include<stdio.h>
#include <windows.h> 
#include <winnt.h> 
#include"Stackpackage.cpp"

int a[8][8];


void gotoxy(int x,int y){
 COORD coord;
 coord.X=6*y+5;
 coord.Y=2*x+1;
 SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord );
}


void BulidMG(int a[][8]){//1为墙,0为路。
int i,j;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
a[i][j]=0;
}
}
for(i=0;i<8;i++){
for(j=0;j<8;j++){
if(i==0||j==0||j==7||i==7)a[i][j]=1;
}
}
a[1][2]=1;a[3][1]=1;a[3][2]=1;a[1][4]=1;a[2][4]=1;
a[3][4]=1;a[5][2]=1;a[5][3]=1;a[5][4]=1;a[5][5]=1;a[5][6]=1;
}

void Print(int a[8][8]){
int i,j;
HANDLE consolehwnd; 
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE); 
printf("\n");
for(i=0;i<8;i++){
for(j=0;j<8;j++){
if(a[i][j]==0){
SetConsoleTextAttribute(consolehwnd,11);
printf("%6d",a[i][j]);
SetConsoleTextAttribute(consolehwnd,13);
}
else{
SetConsoleTextAttribute(consolehwnd,13);
printf("%6d",a[i][j]);
SetConsoleTextAttribute(consolehwnd,11);
}
}
printf("\n");printf("\n");
}
}

int Check(int i,int j){
if(a[i][j-1]==0)
return 1;//左边可以走
else if(a[i-1][j]==0){
return 2;//上面可以走
}
else if(a[i][j+1]==0){
return 3;//右边可以走
}
else if(a[i+1][j]==0){
return 4;//下面可以走
}
return -1;//没有路
}

void AllOut(SQStack &L){
Elemtype *e=L.base;
while(L.top!=L.base)
{
//printf("(%d,%d)->",(L.base++)->i,(L.base)->j);
gotoxy((L.base++)->i,(L.base)->j);
printf("*");
Sleep(1000);
}
printf("\n\n\n\n");
// gotoxy(10,16);
if(L.base==L.top)
printf("输出完毕!");
free(e);
}

void GoRun(SQStack &L,int i,int j){//1左2上3右4下
int m;
Elemtype e;
e.i=i;e.j=j;
InStack(L,e);
a[i][j]=2;//刚走过2
m=Check(i,j);
if(i==6&&j==6){
AllOut(L);
return;
}
if(m==-1){
if(L.base==L.top){
printf("game over!");
}
else{
OutStack(L,&e);
ReadStack(L,&e);
// a[i][j]=2;
//a[e.i][e.j]=3;//退回来3
i=e.i;j=e.j;
}
}
else {

switch(m){
case 1:j--;break;
case 2:i--;break;
case 3:j++;break;
case 4:i++;break;
}
}
GoRun(L,i,j);
}

void main(){
Stack L;
CreateStack(L);
BulidMG(a);
Print(a);
GoRun(L,1,1);
} --------------------编程问答-------------------- #include<stdio.h> 
#include<stdlib.h>
#define False 0
#define OK 1
int Number=100;

typedef struct SQ{
int i;
int j;
}Elemtype;

typedef struct SQStack{
Elemtype *top;
Elemtype *base;
int size;
}Stack;


int CreateStack(Stack &L){
L.base=L.top=(Elemtype *)malloc(Number*sizeof(Stack));
if(L.base==NULL)
return False;
L.size=Number;
return OK;
}

int InStack(Stack &L,Elemtype e){
if(L.top-L.base==L.size){
Number=2*Number;
L.base=(Elemtype *)realloc(L.base,Number*sizeof(Stack));
L.top=L.size+L.base;
L.size=Number;
if(L.base==NULL)
return False;
}
*L.top++=e;
return OK;
}

int OutStack(Stack &L,Elemtype *e){
if(L.top==L.base)
return False;
*e=*(--L.top);
return OK;
}


int ReadStack(Stack &L,Elemtype *e){
if(L.top==L.base)
return False;
*e=*(--L.top);
return OK;
}

/*void main(){
Stack L;
Elemtype l={0,0,1};
Elemtype e;
CreateStack(L);
InStack(L,l);
OutStack(L,&e);
printf("%d %d %d",e.direct,e.i,e.j);
}*/ --------------------编程问答-------------------- 哎,c啊,看不懂啊,java的会不
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,