题目链接:http://www.pipioj.online/problem.php?id=1234

题目描述:

刀塔的世界是一个n × m 的矩阵(n行m列)。

敌法师的blink技能的瞬移距离为d,冷却时间为c。每当敌法师使用blink时,他可以从(x,y)移动至(x+d,y),(x-d,y),(x,y+d)和(x,y-d)4个位置之一,并且不花费任何时间,但是要等c秒之后才能再次使用blink。初始时,敌法师的blink处于可用状态。

敌法师本身具有移动能力,他能花费1秒的时间从(x,y)移动至(x+1,y),(x-1,y),(x,y+1)和(x,y-1)4个位置之一。敌法师也可以选择保持原地不动,但是依旧需要花费1秒。

刀塔的世界会定时刷新出一种叫做赏金神符(Bounty Rune)的东西,抢到它,敌法师就能获得不少的金钱。

现在敌法师得到消息,在(txty)处刷新出了一个赏金神符。此时的敌法师位于(sx,sy),打算尽全力赶过去抢符。敌法师非常熟悉他所在的世界,所以他能用最快的速度赶到赏金神符刷新的地方,但是他不会算数,不知道他一共要花多少的时间。而你虽然不熟悉刀塔世界,但你的算数能力非常好。所以,你能算出他最少要花多少时间才能到达目的地吗?

#include<bits/stdc++.h> 
using namespace std;
const int N=505;
int n,m,d,c,sx,sy,ex,ey,Map[N][N];
bool judge(int x,int y){
	if(x<=0||x>n||y<=0||y>m) return false;
	return true;
}
int dir[5][2]={{0,1},{1,0},{0,-1},{-1,0},{0,0}};
bool vis[N][N][13];//有可能经过同一个点但是技能cd冷却时间不一样 
struct node{
	int x,y,z,t,b;//z表示的是到这一点的时间,t技能cd转了多久,b技能是否已好 
}; 
void bfs(){
	queue<node>q;
	q.push({sx,sy,0,c,1});
	vis[sx][sy][c]=1;
	while(!q.empty()){
		node now=q.front();q.pop();
		//printf("%d %d %d\n",now.x,now.y,now.z);
		if(now.x==ex&&now.y==ey){
			printf("%d\n",now.z);
			return;
		}
		if(now.b){//如果技能转好了 
			for(int i=0;i<4;i++){
				int xx=now.x+d*dir[i][0],yy=now.y+d*dir[i][1];
				if(!judge(xx,yy)||vis[xx][yy][0]) continue;
				vis[xx][yy][0]=1;
				q.push({xx,yy,now.z,0,0});
			}	
		}
		for(int i=0;i<5;i++){
			int xx=now.x+dir[i][0],yy=now.y+dir[i][1];
			if(judge(xx,yy)){
				node nex={xx,yy,now.z+1,now.t+1,0};
				if(vis[xx][yy][now.t+1]) continue;
				vis[xx][yy][now.t+1]=1;
				if(now.t+1>=c){
					nex.t=c;
					nex.b=1;
				}	
			 q.push({xx,yy,now.z+1,nex.t,nex.b});	
			}	
		}
	}
}
int main(){
	scanf("%d%d%d%d",&n,&m,&d,&c);
	scanf("%d%d%d%d",&ex,&ey,&sx,&sy);
	bfs();
}