m0_58092197 2021-06-17 21:04 采纳率: 0%
浏览 17

这个迷宫为什么不能往上走?左右和下方都可以走

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<malloc.h>

#define ROWS 999

#define COLS 999

int length;

int wide;

typedef struct{

    int map[ROWS][COLS];

     int passed[ROWS][COLS];

}Maze;

typedef struct{

 int x;

 int y;

}point;

 

void init_Maze(Maze *m);

void Searchpath(Maze *m,point enter,point exit);

int Judge(int x,int y,int n,int m);

int Decision(Maze *m,point exit,int x,int y);

 

int main()

{ Maze *m=(Maze*)malloc(sizeof(Maze));//分配空间;

   point enter,exit;

  

// printf("请输入迷宫\n");

    init_Maze(m);//创建迷宫

     //设置入口和出口。

// printf("请输入起点坐标\n");

// scanf("%d%d",&enter.x,&enter.y);

// printf("请输入终点坐标\n");

// scanf("%d%d",&exit.x,&exit.y);

 enter.x=0;

 enter.y=0;

 exit.x=length-1;

 exit.y=wide-1;

     Searchpath(m,enter,exit);//寻找路径

 

  return 0;

}

 

void init_Maze(Maze *m)//修建迷宫矩阵 (字符串转数组,防止将多位数识别成一位数)

{ unsigned int j;

   int i=0;

   char str[1024];

   do{

    gets(str);

       if(strlen(str)==0)

    {break;}

    for(j=0;j<strlen(str);j++)

 

    { m->passed[i][j]='0'-'0'; //同时建立记录信息的数组passed

     m->map[i][j]=str[j]-'0';

    }

   i++;

   }while(1);

   length=i;

   wide=j;

 }

 

 void Searchpath(Maze *m,point enter,point exit)//寻找路径

 {  

 

    point current;

    int p;

 int q=0;

    char pass[1024]="";

    current.x=enter.x; //入口赋值

    current.y=enter.y;

    m->passed[enter.x][enter.y]=1;//给记录信息的数组的起点赋1,代表经过一次,每经过一次加1

  // char arr[99];

 /*

   1.判断是否越界;

     2.选择可行的方向(是否为通路,是否越界,选择最小值);

   3.成功选择需要记录在信息数组上。

 */                                                                                  

    do{

  if(current.x==exit.x&&current.y==exit.y)

   { 

   break;

  }

 /* if(current.x==enter.x&&current.y==enter.y)

  {

  if(m->passed[current.x+1][current.y]!=0&&m->passed[current.x-1][current.y]!=0&&m->passed[current.x][current.y+1]!=0&&m->passed[current.x][current.y-1]!=0)

  {

   

   printf("NO PASS");

   break;

  }

  }

  */

  p=Decision(m,exit,current.x,current.y);

 

     //判断能否往右走(最小值)并执行以及记录行走轨迹信息 

      if(p==0||p==1)

  { 

    

  p=0;

 

  

  if(m->map[current.x][current.y+1]==0 )

  

  {

   current.y=current.y+1;

      m->passed[current.x][current.y]=m->passed[current.x][current.y]+1;

   //printf("R");

 

   if(pass[q-1]!='L')

   {   

   pass[q]='R';

   q++;

   }

   else

    q--;

           continue;

  }

   

  }

  //判断能否往下走 

   if(p==0||p==2)

  { 

  p=0;

 

  if(m->map[current.x+1][current.y]==0)

    

  {

   current.x=current.x+1;

   m->passed[current.x][current.y]=m->passed[current.x][current.y]+1;

  // printf("D");

   if(pass[q-1]!='U')

   {   

   pass[q]='D';

   q++;

   }

   else

    q--;

    continue;

  }

 

 

    }

    

     //判断能否往左走  

     

      if(p==0||p==3)

     {

    p=0; 

 

  if(m->map[current.x][current.y-1]==0)

    

  { current.y=current.y-1;

  m->passed[current.x][current.y]=m->passed[current.x][current.y]+1;

  //printf("L");

   if(pass[q-1]!='R')

   {   

   pass[q]='L';

   q++;

   }

   else

    q--;

 continue;

 

  }

   

  }

  

  

  //判断能否往上走  

   if(p==0||p==4)

  { 

    p=0;

 

  if(m->map[current.x-1][current.y]==0)

  

  {

   current.x=current.x-1;

   m->passed[current.x][current.y]=m->passed[current.x][current.y]+1;

   //printf("U");

   if(pass[q-1]!='D')

   {   

   pass[q]='U';

   q++;

   }

   else

    q--;

   continue;

 

  }

  

        }

 

  }while(1);

 

  puts(pass);

  }

 

//判断是否越界

 int Judge(int a,int b,int m,int n)//判断移动的点是否越界; 

 {

  if(a>=0 && a<=m)

 

  {

   if(b>=0 && b<=n)

   {return 1;}

  }

  return 0;

 }

 

 

//判断选择最小方向

 int Decision(Maze *m,point exit,int x,int y)

 {

  int min=99;

 int a=0;

 int k=0;

  

  if(Judge(x,y+1,exit.x,exit.y)==1)

  {

   if(m->passed[x][y+1] <min)//判断向右 

          

    {      

   

           min=m->passed[x][y+1]; //记下最小值

                k=1;

               

    }

 

  }   

   

    if(Judge(x+1,y,exit.x,exit.y)==1)//判断向下

    {

     if (m->passed[x+1][y]<min)

     {

      min=m->passed[x+1][y];    

      k=2; 

     

     }   

    }

   

   

    if(Judge(x,y-1,exit.x,exit.y)==1)

   {

     if(m->passed[x][y-1]<min)//判断向左 

     {   

    

    min=m->passed[x][y-1];

 

       k=3;

   

   

     }

    }

        if(Judge(x-1,y,exit.x,exit.y)==1)

   {

   if(m->passed[x-1][y]<min)//判断向上 

   {    

    min=m->passed[x-1][y];

    k=4;

   

    

    }

 

  }

 

  switch(k)

  {

   case 1: a=1;break;//右 

   case 2: a=2;break;//下 

   case 3: a=3;break;//左 

   case 4: a=4;break;//上 

   default:0;

  } 

 return a;

 }  

 

/*

 

 

 

  */

 

 

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2021-06-21 16:52
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,目前超出我们的服务范围,暂时无法为您解答。

    首次提问人员可免费体验一次有问必答服务。目前首次提问的问题服务范围为:编程语言、Java开发、python、数据库、前端开发 领域专业技术问题,为您提供问题的解决思路和指导。不提供源码代写、项目文档代写、论文代写、作业代写、安装包资源发送或安装、软件使用指导等服务。

    我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。

    评论

报告相同问题?

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退