HDU - 3533 Escape

mac2022-06-30  20

题意:一个人从(0,0)跑到(n,m),只有k点能量,一秒消耗一点,在图中有k个炮塔,给出炮塔的射击方向c,射击间隔t,子弹速度v,坐标x,y  ,问这个人能不能安全到达终点(且可以待在原地) m,n,k和d(2 <= m,n <= 100,0 <= k <= 100,m + n <= d <= 1000)。 m和n是战场的大小,k是城堡的数量,d是Little A最初拥有的能量单位思路:看当人位于某个点的时候,其四个方向是否有炮塔,这个炮塔是都向人的方向射击,然后再看子弹是否刚好位于这个坐标即可同时用state[x][y][time]标记,对于time时刻,人位于x,y的情况只需要访问一次,这是唯一的

 

完整代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <vector>#include <queue>#include <string>using namespace std;const int MAXN = 105;bool M[MAXN][MAXN], st[MAXN][MAXN][1010];bool vis[MAXN][MAXN][1010];int mov[5][2] = {-1,0, 1,0, 0,1, 0,-1,0 ,0};int n, m, k, d;struct Castle{    int dir, x, y, t,v;}Castle[MAXN];struct node{    int x, y, step;};void init(){    memset(st, 0,sizeof(st));    for(int i = 0; i<k; i++)    //枚举城堡    {        for(int j = 0; j<=d; j += Castle[i].t)    //模拟一颗子弹        {            for(int k = 1; ; k++)   //枚举路程            {                int x = Castle[i].x + mov[Castle[i].dir][0]*k;                int y = Castle[i].y + mov[Castle[i].dir][1]*k;                if(x<0 || x>n || y<0 ||y>m || M[x][y]) break;                if(k
转载请注明原文地址: https://mac.8miu.com/read-70425.html
最新回复(0)