迷宫问题 (BFS)

定义一个二维数组: 

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 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
struct node{
    int x,y;
    int pre;
}nodes[36];
int Map[6][6];
int vis[6][6]={0};
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void print(int head)
{
    while(nodes[head].pre!=-1)
    {
        print(nodes[head].pre);
        printf("(%d, %d)\n",nodes[head].x,nodes[head].y);
        return ;
    }
}
void bfs(int x,int y)
{
   int head = 0;
   int tail = 1;
   nodes[0].x = 0;
   nodes[0].y = 0;
   nodes[0].pre = -1;

   struct node New;
   while(head < tail)
   {
       if(nodes[head].x ==4 && nodes[head].y ==4)
       {
           print(head);
           return ;
       }
       for(int i = 0;i<4;i++)
       {
           New.x = nodes[head].x + dir[i][0];
           New.y = nodes[head].y + dir[i][1];
           New.pre = head;
           if(New.x>=0&&New.x<=4&&New.y>=0&&New.y<=4)
           {
               if(!vis[New.x][New.y]&&!Map[New.x][New.y])
               {
                   vis[New.x][New.y] = 1;
                   nodes[tail++] = New;
               }
           }
       }
       head++;
   }
}
int main(){
    for(int i = 0;i<5;i++)
    {
        for(int j = 0;j<5;j++)
        {
            scanf("%d",&Map[i][j]);
        }
    }
    printf("(0, 0)\n");
    bfs(0,0);
    return 0;
}

 

你可能感兴趣的:(BFS)