题目描述(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;
}