迷宫求解无敌版(递归调用法)

测试代码:

  1   0   0   0   0   0   1   0
  0   1   1   0   0   0   1   0
  0   0   1   0   1   0   1   0
  0   1  -1   0   1   0   0   0
  0   1   0   1   0   1   1   0
  0   0   1   0   0   1   0   0
  1   0   1   0   0   1   0   1
  0   0   1   0   0  -2   0   0


 1代表障碍,0代表能走通,-1代表入口 2代表出口路径 
本题我使用的是递归调用的方法解决的,
是一种深收的算法,呵呵!!!废话不多说,看哥的
精彩程序吧!!!

 

这里 0代表能走通,1代表障碍,2代表通道,3代表起始点和终止点
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#define INT_SIZE 1000
using namespace std;


int a[100][100];//声明数组,用来存每个坐标
int path[100];//声明数组,用来存放通道路径
int n=0,k=0;//标记作用

int Find(int i1,int j1,int line1,int rows1)//递归程序
{
  int i,j,line,rows,mark=0;
 i=i1;
 j=j1;
 line=line1;
 rows=rows1;
 if(a[i][j]==-2)
   return 1;
 if(a[i][j]==1||a[i][j]==5)
   return 0;
 
  else
  {  
   a[i][j]=5;
  if(i==0&&j==0&&mark!=1)//左上角
   {
    if(Find(i+1,j,line,rows)==1)
     n=1;
   else
    if(Find(i,j+1,line,rows)==1)
     n=1;
       if(n>0)
    {
     path[k]=i*rows+j;
     k++;
   return k;
    }
    mark=1;
   
  }
  
  
  
  
  
       if(i==0&&j==rows-1&&mark!=1)//右上角
   {
   
     if(Find(i,j-1,line,rows)==1)
     n=1;
       else if(Find(i+1,j,line,rows)==1)
     n=1;
          if(n>0)
    {
     path[k]=i*rows+j;
     k++;
    return k;
    }
   mark=1;
  
   }
 
  
  
  
  
  
  
   if(i==line-1&&j==0&&mark!=1)//左下角
  {
   
    if(Find(i-1,j,line,rows)==1)
     n=1;
    else if(Find(i,j+1,line,rows)==1)
     n=1;
   if(n>0)
    {
     path[k]=i*rows+j;
     k++;
    return k;
     }
   mark=1;
  
   
  }
  
  
  
  
   if(i==line-1&&j==rows-1&&mark!=1)//右下角
   {
    if(Find(i,j-1,line,rows)==1)
     n=1;
   else if(Find(i-1,j,line,rows)==1)
     n=1;
    if(n>0)
    {
     path[k]=i*rows+j;
     k++;
    return k;
    }
   mark=1;
  
   }

   if(i==0&&mark!=1)//上边界
      { 
    if(Find(i,j-1,line,rows)==1)
     n=1;
    else
    {
     if(Find(i,j+1,line,rows)==1)
     n=1;
        else if(Find(i+1,j,line,rows)==1)
     n=1;
    }
    if(n>0)
    {
     path[k]=i*rows+j;
     k++;
    return k;
    }
   mark=1;
  
   }
  
  
  
  
   if(j==0&&mark!=1)//左边界
      {
    if(Find(i-1,j,line,rows)==1)
     n=1;
    else
    {
     if(Find(i+1,j,line,rows)==1)
     n=1;
    else if(Find(i,j+1,line,rows)==1)
     n=1;
    }
    if(n>0)
    {
     path[k]=i*rows+j;
     k++;
     return k;
    }
   mark=1;
  
   }
  
  
  
   if(i==line-1&&mark!=1)//下边界
      {
    if(Find(i,j-1,line,rows)==1)
     n=1;
    else
    {
     if(Find(i,j+1,line,rows)==1)
     n=1;
    else if(Find(i-1,j,line,rows)==1)
     n=1;
    }
    if(n>0)
    {
     path[k]=i*rows+j;
     k++;
    return k;
    }
   mark=1;
  
   }


   if(j==rows-1&&mark!=1)//右边界
      {
    if(Find(i-1,j,line,rows)==1)
     n=1;
   else
   {
    if(Find(i+1,j,line,rows)==1)
     n=1;
    else if(Find(i,j-1,line,rows)==1)
     n=1;
   }
    if(n>0)
    {
     path[k]=i*rows+j;
     k++;
    return k;
    }
   mark=1;
  

   }

       if(mark!=1)//普通点
    {
    if(Find(i-1,j,line,rows)==1)
     n=1;
    else
    {
    if(Find(i+1,j,line,rows)==1)
     n=1;
    else
    {
     if(Find(i,j-1,line,rows)==1)
     n=1;
   
    else if(Find(i,j+1,line,rows)==1)
            n=1;
    }

    }
    if(n>0)
    {
     path[k]=i*rows+j;
     k++;
        return k;
    }
     mark=1;
    }
   
  }

return 0;
}
   
        

              

int main()
{
 int line,rows,i,j,starti,startj,endi,endj;
 printf("欢迎使用本迷宫求解系统\n");
 printf("---------------------------------------------------\n");
 printf("请输入迷宫的行数和列数:\n");
    cin>>line>>rows;
 memset(a,0,sizeof(a));
 memset(path,-1,sizeof(path));
 printf("请输入障碍点坐标的个数:\n");
 int num,m;
 cin>>num;
    m=num;
 while(m--)
 {
  printf("请输入第%d个障碍点的坐标:\n",num-m);
        cin>>i>>j;
  a[i][j]=1;
 }

 printf("请输入迷宫起始点的坐标:\n");
       cin>>starti>>startj;
    a[starti][startj]=-1;
 printf("请输入迷宫出口点的坐标:\n");
    cin>>endi>>endj;
    a[endi][endj]=-2;
    i=starti;
    j=startj;
 if(Find(i,j,line,rows)>0)
  {
  cout<<"Great"<<endl;
     for(k=0;path[k]!=-1;k++)
  {
   i=path[k]/rows;
   j=path[k]%rows;
   a[i][j]=2;
  }
  a[starti][startj]=3;
  a[endi][endj]=3;
     for(i=0;i<line;i++)
  {
   for(j=0;j<rows;j++)
   {
      if(a[i][j]==5)
       a[i][j]=0;
    cout<<a[i][j]<<" ";
   }
      cout<<endl;
  }
     
  
 }
  else
     cout<<"由于您输入错误,此迷宫没有出路"<<endl;
                                 
    return 0;
}

原文地址:https://www.cnblogs.com/xiohao/p/3023291.html