电子老鼠闯迷宫
时限: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> using namespace std; queue<int>q; int x1,y1,x2,y2; char map[12][13]; int step[200]; int used[200]={0}; int dr[4]={0,1,0,-1}; int dc[4]={-1,0,1,0}; void readmap(); void init(int s); int bfs(); int canmove(int u,int dire); int move(int u,int dire); int main() { int num,u; cin>>x1>>y1>>x2>>y2; x1--;x2--;y1--;y2--; u=x1*12+y1; init(u); readmap(); num = bfs(); cout << num << endl; return 0; } int bfs() { int u,v,i; while(!q.empty()) { u = q.front(); q.pop(); for(i = 0;i < 4; i ++) { if(canmove(u,i)) { v = move(u,i); if(v == x2*12+y2) { return (step[u]+1); } else { used[v] = 1; step[v] = step[u]+1; q.push(v); } } } } } int canmove(int u,int dire) { int row,col,r,c; row = u/12; col = u%12; r = row + dr[dire]; c = col + dc[dire]; if(r >= 0 && r < 12 && c >= 0 && c < 12 && map[r][c] =='.'&& used[r*12+c] == 0) { return 1; } else { return 0; } } int move(int u,int dire) { int row,col,r,c,v; row = u/12; col = u%12; r = row + dr[dire]; c = col + dc[dire]; v = r*12 + c; return (v); } void readmap() { int i; for(i=0;i<12;i++) { cin>>map[i]; } } void init(int s) { step[s]=0; used[s]=1; q.push(s); }