zoukankan      html  css  js  c++  java
  • 迷宫求解无敌版(递归调用法)

    测试代码:

      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;
    }

  • 相关阅读:
    shell脚本查找tcp过多ip地址封掉
    tomcat日志传参乱码问题
    nginx部署vue跨域proxy方式
    nginx部署VUE跨域访问api
    springboot2.1.3 + redisTemplate + Lock 操作 redis 3.0.5
    java8 lamb表达式对List排序
    Mysql5.7降级到5.6遇到的坑
    mac中git使用
    mac中git flow使用
    mac安装openjdk8-maven-mysql-git-docker
  • 原文地址:https://www.cnblogs.com/xiohao/p/3023291.html
Copyright © 2011-2022 走看看