南邮 OJ 2061 走迷宫

走迷宫

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 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");
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值