POJ 3984 迷宫问题 广搜记录路径

来源:互联网 发布:php submit提交 编辑:程序博客网 时间:2024/05/21 07:25
G - 迷宫问题
Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu
Submit Status

Description

定义一个二维数组: 
int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0 1 0 0 00 1 0 1 00 0 0 0 00 1 1 1 00 0 0 1 0

Sample Output

(0, 0)(1, 0)(2, 0)(2, 1)(2, 2)(2, 3)(2, 4)(3, 4)

(4, 4)

思路:第一次接触记录路径问题,还是不太熟练怎么记录路径;除了记录路径其余的用广搜就很简单了也很好理解;

这里我在结构体里多定义了一个存储他的上一个父节点;然后用递归回溯父节点,输出即可,令第一个的父节点为-1;

#include<stdio.h>#include<string.h>int next[4][2]= {1,0,-1,0,0,1,0,-1};  int mase[6][6];struct node{   int x;    int y;    int s;}q[100];void print(int num){    if(num!=-1)     {   print(q[num].s);        printf("(%d, %d)\n",q[num].x,q[num].y);   }}int main(){    int i,j;     int head,tail;     for(i=0;i<5;i++)       for(j=0;j<5;j++)           scanf("%d",&mase[i][j]);     head=0;     tail=0;     q[tail].x=0;     q[tail].y=0;     q[tail].s=-1;     tail++;     int flag=0;     while(head<tail)     {          for(i=0;i<4;i++)      {   int tx=q[head].x+next[i][0];          int ty=q[head].y+next[i][1];          if(tx>=0&&tx<5&&ty>=0&&ty<5&&mase[tx][ty]==0)          {       mase[tx][ty]=1;           q[tail].x=tx;                  q[tail].y=ty;                  q[tail].s=head;                    if(tx==4&&ty==4)     {           print(q[tail].s);//当到达4,4时直接找上一个父节点,这个一个4,4就无法输出,所以要自己输出; printf("(4, 4)\n");          flag=1;         break; }      tail++;  }  }  if(flag)    break;    head++;}return 0;         }

1 0