mzoj 1345: 英雄(Bfs)

题目描述(Description):

城堡迷宫由N×M个格子组成,英雄Mario玛丽奥要在城堡迷宫中从起始点移动到目标点去拯救被怪物掳去的公主,他每一步只能从当前所在的格子移动到相邻的4个格子之一,而且不能移出城堡的范围,走一步需要1秒的时间。
城堡中某些格子里面有弹簧,每个弹簧具有特定的能量K,不同弹簧的K值不一定相同。如果Mario跳到一个有弹簧的格子,他就会继续向前跳,直到Mario跳到一个空的格子或者被墙所阻挡无法继续向前。
请你计算Mario从起始点到达目标点(公主位置)需要的最短时间,如果不能到达,输出“Impossible”。
输入文件:

第一行,两个整数,N和M(3<=N,M<=100),分别表示城堡的行和列。
第二行,一个非负整数K,表示弹簧的数量。接下来K行,每行含3个正整数——X,Y,P。其中X,Y是弹簧的坐标(2<=X<=N-1,2<=Y<=M-1),P是该弹簧的能量。
接下来最后两行,第一行是Mario的坐标,第二行是公主的坐标。
注意:输入文件保证没有一个弹簧是挨着城堡围墙的。
输出文件:

输出Mario从初始位置到达公主所在位置需要的最短时间(秒)。
如果不能到达,则输出“Impossible”。(引号不需输出)

当时很蠢,写了个dfs来判弹簧;炸了6分 (安逸)。水题都不能A掉。

#include<bits/stdc++.h>
#define inf 1<<30
using namespace std;
const int maxn=100+50;
struct node
{
	int x,y,step;
};
int zx[]={0,0,1,-1};
int zy[]={1,-1,0,0};
int mapn[maxn][maxn];
int mark[maxn][maxn];
bool vis[maxn][maxn];
int n,m,k;
int sx,sy;
int ex,ey; 
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return x*f; 
}
void bfs()
{
	node a;
	a.x=sx;a.y=sy;a.step=0;
	queue<node>q;
	q.push(a);
	vis[sx][sy]=1;
	while(!q.empty())
	{
	node b=q.front();
	q.pop();
	int x=b.x,y=b.y,step=b.step;
	if(x==ex&&y==ey)
	{
		printf("%d",step);
		exit(0);
	}
	for(int i=0;i<=3;i++)
	{
		int nx=x+zx[i],ny=y+zy[i];
		if(nx>0&&ny>0&&nx<=n&&ny<=m)
		{
			node c;
			if(vis[nx][ny])
	        continue;
			while(mark[nx][ny])
			{nx+=zx[i]*mark[nx][ny];
			if(nx<1)nx=1;if(nx>n)nx=n;
			ny+=zy[i]*mark[nx][ny];
			if(ny<1)ny=1;if(ny>m)ny=m;} 
			c.step=step+1;c.x=nx;c.y=ny;
		    q.push(c);
		    vis[nx][ny]=1;
		}
	}
    }
}
int main()
{
	n=read();m=read();k=read();
	for(int i=1;i<=k;i++)
	{
		int x=read(),y=read(),p=read();
		mark[x][y]=p;
	}
	sx=read();sy=read();
	ex=read();ey=read();
	bfs();
	printf("Impossible");
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值