经典算法-(六)老鼠走迷宫

问题描述:

给定一个二维数组,数组中2表示墙壁,0表示通路,由此数组可展示为一个迷宫图。给定入口位置和出口位置,判断之间是否存在通路并显示出走出迷宫的道路。

问题解答:

实际上是使用回溯算法求解该问题,就是在上下左右四个方向试探,倘若有路则走一步,在新的位置继续在四个位置试探,并且对走过的路进行标记,倘若走到死胡同里,则退回上一步再来试探,以此类推,类似于图的深度优先算法,使用递归来实现。

java实现:

package a;
import java.math.BigInteger;
import java.util.*;
public class Main{     
    public static  void main(String[] args)  {  
        System.out.println("请输入一数来开始");
        Scanner cin = new Scanner(System.in);       
        while(cin.hasNext()){
          String n=cin.next();
          int[][] maze =new int [][] {
                {2,2,2,2,2,2,2,2,2},  
                {2,0,0,0,0,0,0,0,2},  
                {2,0,2,2,0,2,2,0,2},  
                {2,0,2,0,0,2,0,0,2},  
                {2,0,2,0,2,0,2,0,2},  
                {2,0,0,0,0,0,2,0,2},  
                {2,2,0,2,2,0,2,2,2},  
                {2,0,0,0,0,0,0,0,2},  
                {2,2,2,2,2,2,2,2,2}  
                };   
             xun(maze,1,1);
                
 }
        cin.close();      
    }
    static void xun(int[][] a,int i,int j) {
               a[i][j]=1; 
            if(i==7&&j==7)
            { System.out.println("打印一波:--------------");
            System.out.println();
                for(int m=0;m<9;m++) {
                    for (int n=0;n<9;n++) {
                        System.out.print(a[m][n]+" ");
                    }
                    System.out.println();
                }
            }
            if(a[i][j+1]==0) {
                  xun(a,i,j+1);
                }
            if(a[i+1][j]==0) {
                    xun(a,i+1,j);    
            }
             if(a[i-1][j]==0) {
                xun(a,i-1,j);    
            }
             if(a[i][j-1]==0) {
                xun(a,i,j-1);    
            }
             a[i][j]=0;
    }
}

运算结果:

点评:

现在的代码是将所有可能的路线都打印出来了,稍微修改下可以实现打印一种结果,打印了所有的结果正是体现了回溯法可实现遍历出所有可能的答案。

顺便附上打印一种结果的实现代码 :

c++实现:

#include <stdio.h>
#include <stdlib.h>

int visit(int , int );

int maze[7][7] = {
    {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} 
};

int startI = 1, startJ = 1;
int endI = 5, endJ = 5;
int success = 0;

int main(void)
{
    int i, j;

    printf("显示迷宫:\n");
    for(i = 0; i < 7; i++)
    {
        for(j = 0; j < 7; j++)
        {
            if(maze[i][j] == 2)
                printf("#");
            else
                printf(" ");
        }
        printf("\n");
    }
    
    if(visit(startI, startJ) == 0)
        printf("\n没有找到出口!\n");
    else
    {
        printf("\n显示路径:\n");
        for(i = 0; i < 7; i++)
        {
            for(j = 0; j < 7; j++)
            {
                if(maze[i][j] == 2)
                    printf("#");
                else if(maze[i][j] == 1)
                    printf("1");
                else
                    printf(" ");
            }
            printf("\n");        
        }
    }
    return 0;
} 

int visit(int i, int j)
{
    maze[i][j] = 1;
    
    if(i == endI && j == endJ)
        success = 1;
        
    if(success != 1 && maze[i][j+1] == 0)
        visit(i, j+1); 
    if(success != 1 && maze[i+1][j] == 0)
        visit(i+1, j);
    if(success != 1 && maze[i][j-1] == 0)
        visit(i, j-1);
    if(success != 1 && maze[i-1][j] == 0)
        visit(i-1, j);
        
    if(success != 1)
        maze[i][j] = 0; 
    return success;
}

 

posted @ 2017-10-19 20:40  code-life  阅读(5732)  评论(0编辑  收藏  举报