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; }