迷宫问题

来源:互联网 发布:网络运营任职资格 编辑:程序博客网 时间:2024/05/02 02:18

俺的递归还停留在计算阶乘的程度啊,把数据结构翻了出来,看了这个迷宫的问题,试着自己写了一个,我写的好麻烦啊,还是书上的答案简单啊,贴在后面了。

/*********************************************************************************************************
文件名称 : labyrinth.c
建立时间 : 2006-2-28 15:08
版权所有 : 东软股份大连分公司电信事业开发部
Author   : 中介部.吴喆喆
文件描述 :
  迷宫问题
  修改记录 :
========================================================================================================
序号 修改日期    修改人 修改原因

*********************************************************************************************************/

#include <stdio.h>
#include <string.h>

#define BUFSIZ 1024
int map[8][7] = {
 {1,1,1,1,1,1,1},
 {1,0,1,0,0,0,1},
 {1,1,0,1,1,0,1},
 {1,1,0,1,1,0,1},
 {1,1,1,0,1,1,1},
 {1,0,0,1,0,1,1},
 {1,1,1,1,0,0,1},
 {1,1,1,1,1,1,1}
};

struct pos
{
 int x;
 int y;
};

int flag = 0; //是否找到了路径

void printmap(int *p)
{
 int i,j;
 int c=0;
 for (i=0;i<56;i++)
 {
  printf("%2d", p[i]);
  ++c;
  if (c%7==0)
  {
   printf("/n");
   c=0;
  }
 } 
}
/*locx和locy是当前的位置*/


int go(int locx, int locy)
{
 int i;
 int tr = 0;
 struct pos fpos;
 struct pos roads[8];
 
 //printf("(%d, %d)/n", locx, locy);
 if (locx == 6 && locy == 5)
 {
  //printf("(%d, %d)/n", locx, locy);
  flag = 1;
  return 1;
 }
 else
 {
  //searchroads(locx, locy);
  
  //左
  if (map[locx][locy-1] == 0)
  {
   fpos.x = locx;
   fpos.y = locy-1;
   roads[tr++] = fpos;
  }
  
  //左上
  if (map[locx-1][locy-1] == 0)
  {
   fpos.x = locx-1;
   fpos.y = locy-1;
   roads[tr++] = fpos;
  }
  
  //上
  if (map[locx-1][locy] == 0)
  {
   fpos.x = locx-1;
   fpos.y = locy;
   roads[tr++] = fpos;
  }
  
  //右上
  if (map[locx-1][locy+1] == 0)
  {
   fpos.x = locx-1;
   fpos.y = locy+1;
   roads[tr++] = fpos;
  }
  
  //右
  if (map[locx][locy+1] == 0)
  {
   fpos.x = locx;
   fpos.y = locy+1;
   roads[tr++] = fpos;
  }
  
  //右下
  if (map[locx+1][locy+1] == 0)
  {
   fpos.x = locx+1;
   fpos.y = locy+1;
   roads[tr++] = fpos;
  }
  
  //下
  if (map[locx+1][locy] == 0)
  {
   fpos.x = locx+1;
   fpos.y = locy;
   roads[tr++] = fpos;
  }
  
  //左下
  if (map[locx+1][locy-1] == 0)
  {
   fpos.x = locx+1;
   fpos.y = locy-1;
   roads[tr++] = fpos;
  }
  
  printf("(%d, %d)/n", locx, locy);
  
  
  
  if (tr == 0)
   map[locx][locy] = 2;
  
  
  //test
  if (locx==2 && locy==5)
   printmap(map[0]);
  if (locx==3 && locy==5)
   printmap(map[0]);
  
  
  for (i = 0; i < tr; ++i)
  {
   //往下一步走, 之前要把当前位置由0变为2, 表示走过
   
   map[locx][locy] = 2;
   if (flag)  //如果不在这里设置return, 那么就会打印所有的路径
    return 1;
   else
    go(roads[i].x, roads[i].y);
  }
 }
}


main(void)
{
 int m;
 m = go(1,1);
 
 //printf("%d/n", m);
}

 

书上的好的方法是:

int maze[8][7] = {
 {1,1,1,1,1,1,1},
 {1,0,1,0,0,0,1},
 {1,1,0,1,1,0,1},
 {1,1,0,1,1,0,1},
 {1,1,1,0,1,1,1},
 {1,0,0,1,0,1,1},
 {1,1,1,1,0,0,1},
 {1,1,1,1,1,1,1}
};

int way(int locx, int locy)
{
 if (maze[6][5] == 2)
  return 1;
 else
 {
  if (maze[locx][locy] == 0) //û؟¹�
   maze[locx][locy] = 2;
   
   if (way(locx, locy-1))
    return 1;
   else if (way(locx+1, locy-1))
    return 1;
   else if (way(locx+1, locy))
    return 1;
   else if (way(locx+1, locy+1))
    return 1;
   else if (way(locx, locy+1))
    return 1;
   else if (way(locx-1, locy+1))
    return 1;
   else if (way(locx-1, locy))
    return 1;
   else if (way(locx-1, locy-1))
    return 1;
   else   /*no way*/
   {
    maze[locx][locy] = 3;
    return 0;
   }
  }
  else
   return 0;
   
  
  
 }
}

int main()
{
 int i,j;
 way(1,1);
 
 for (i=0;i<8;++i)
 {
  for (j=0;j<7;++j)
   printf("[%d]", maze[i][j]);
  
  printf("/n");
 }
 
 //printf("%d/n", maze[0][0]);
}