走迷宫
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 21 测试通过 : 12
总提交 : 21 测试通过 : 12
比赛描述
一个网格迷宫由n行m列的单元格组成,每个单元格要么是空的(用0来表示),要么是障碍物(用1来表示)。你的任务是找出从起点到终点的最短步数。
输入
第一行输入三个整数n,m(0<n,m<=100),k(k代表障碍物的数量),接下来的k行每行输入两个数x,y代表障碍物的位置(0<x,y<=m),最后两行分别输入迷宫的起点a,b和终点c,d
输出
如果能够到达则输出最短步数,否则输出false。
样例输入
6 5 9
4 4
4 6
3 1
2 2
2 3
2 4
4 3
5 3
4 5
1 1
5 6
样例输出
12
提示
undefined
题目来源
BJ
#include<iostream>
#include<queue>
#define MAX_N 101
using namespace std;
bool blocked[MAX_N][MAX_N];
struct point{
int x,y,step;
};
int main(){
// freopen("test.txt","r",stdin);
int n,m,k,x,y,a,b,c,d,i,minStep;
int dir[4][2]={0,-1,0,1,-1,0,1,0};
bool flag = 0;
point p1,p2;
queue<point> q;
scanf("%d%d%d",&n,&m,&k);
while(k--){
scanf("%d%d",&x,&y);
blocked[x][y]=1;
}
scanf("%d%d%d%d",&a,&b,&c,&d);
p2.x = a;
p2.y = b;
p2.step = 0;
q.push(p2);
blocked[a][b]=1;
while(!flag && !q.empty()){
p1 = q.front();
q.pop();
a = p1.x;
b = p1.y;
for(i=0;i<4 && !flag;i++){
x = a+dir[i][0];
y = b+dir[i][1];
if(x>0 && x<=n && y>0 && y<=m && !blocked[x][y]){
if(x==c && y==d){
flag = 1;
minStep = p1.step+1;
break;
}
p2.x = x;
p2.y = y;
p2.step = p1.step+1;
q.push(p2);
blocked[x][y] = 1;
}
}
}
if(flag){
printf("%d",minStep);
}else{
printf("false\n");
}
}