1. 程式人生 > >1042電子老鼠闖迷宮 (廣搜)

1042電子老鼠闖迷宮 (廣搜)

1042.電子老鼠闖迷宮

時限:1000ms 記憶體限制:10000K  總時限:3000ms

描述

有一隻電子老鼠被困在如下圖所示的迷宮中。這是一個12*12單元的正方形迷宮,黑色部分表示建築物,白色部分是路。電子老鼠可以在路上向上、下、左、右行走,每一步走一個格子。現給定一個起點S和一個終點T,求出電子老鼠最少要幾步從起點走到終點。

輸入

本題包含一個測例。在測例的第一行有四個由空格分隔的整數,分別表示起點的座標S(x.y)和終點的座標T(x,y)。從第二行開始的12行中,每行有12個字元,描述迷宮的情況,其中'X'表示建築物,'.'表示路.

輸出

輸出一個整數,即電子老鼠走出迷宮至少需要的步數。

輸入樣例

2 9 11 8 XXXXXXXXXXXX X......X.XXX X.X.XX.....X X.X.XX.XXX.X X.X.....X..X X.XXXXXXXXXX X...X.X....X X.XXX...XXXX X.....X....X XXX.XXXX.X.X XXXXXXX..XXX XXXXXXXXXXXX

輸出樣例

28

程式碼:

#include<iostream> #include<queue> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; char ma[13][13]; int vis[13][13]; int sx,sy,ex,ey; struct node {     int x,y,step; }; int judge(int x,int y) {     if(x<=0||x>12||y<=0||y>12||vis[x][y]||ma[x][y]=='X')return 0;     else return 1; } int BFS(int x,int y) {     queue<node>q;     node t,a,next;     t.x=x;     t.y=y;     t.step=0;     vis[x][y]=1;     q.push(t);     while(!q.empty())     {         a=q.front();         q.pop();         if(a.x==ex&&a.y==ey)             return a.step;         for(int i=0;i<4;i++)         {             next=a;             next.x=a.x+dir[i][0];             next.y=a.y+dir[i][1];             if(judge(next.x,next.y))             {                next.step=a.step+1;                vis[next.x][next.y]=1;                q.push(next);             }         }     }     return -1; } int main() {         memset(ma,0,sizeof(ma));         memset(vis,0,sizeof(vis));         cin>>sx>>sy>>ex>>ey;         for(int i=1;i<=12;i++)         cin>>ma[i];         cout<<BFS(sx,sy)<<endl;     return 0; }