暑假集训第三周第二阶段搜索 G - 迷宫问题

来源:互联网 发布:淘宝店铺都多大尺寸 编辑:程序博客网 时间:2024/06/11 14:27


G - 迷宫问题
Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u
Submit Status Practice POJ 3984

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)

分析:

越来越感觉学习起来很吃力,很多东西都不懂。

只是一道迷宫问题典型的广搜问题,里边还用了模拟队列。各种方法,各种不理解,我什么时候可以会啊


12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
#include<stdio.h>#include<string.h>void  print (int value ,int prev[25]){    if(value>=0)    {        int x=value/5;        int y=value%5;        print(prev[value],prev);        printf("(%d, %d)\n",x,y);    }}void solve (int m[5][5]){    int v[5][5],queue[25],f=0,r=0,x=0,y=0,prev[25];    memset(v,0,sizeof(v));    memset(prev,-1,sizeof(prev));    prev[0]=-1;    int of[4][2]= {1,0,-1,0,0,-1,0,1};    queue[++r]=0;    v[x][y]=1;    while(f<=r)    {        int i,newx,newy;        f++;        x=queue[f]/5;        y=queue[f]%5;        for(i=0; i<4; i++)        {            newx=x+of[i][0];            newy=y+of[i][1];            if(newx>=0&&newx<5&&newy>=0&&newy<5&&!v[newx][newy]&&!m[newx][newy])            {                r=(r+1)%25;                queue[r]=newx*5+newy;                prev[newx*5+newy]=x*5+y;                v[newx][newy]=1;            }        }    }    print(24,prev);}int main(){    int m[5][5],i=0,j=0;    while(scanf("%d",&m[i][j++])!=EOF)    {        if(j==5)        {            i++;            j=0;        }        if(i==5)        {            solve(m);            i=0;        }    }    return 0;}

0 0
原创粉丝点击