hdu 3533 搜索+预处理

题意是给你一个地图,地图里有的点是炮台  炮台每隔一段时间回想固定的方向发射一定速度的炮弹,炮弹不能穿过炮台,炮弹只有只有在整点才能打中人,开始你在(0,0)的位置  问你能不能再规定的时间内走到终点;

最对100个炮台,最多走1000步  很明显   把地图预先处理下  及每个点在某一时间有炮弹  那么人就不能走,  开个3维    来标记,还有  数组必须用bool型的要不然要超类存,

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;

int n,m,k,d;
bool map[101][101][1001];
bool mark[101][101][1001];
struct node
{
    int x,y;
    int tt;
}a,b;
struct Node
{
    int dir;
    int x,y;
    int t,v;
}bull[110];
int dir1[4][2]={-1,0,0,1,1,0,0,-1};
int dir[5][2]={0,0,0,1,0,-1,1,0,-1,0};
int deal(int x)
{
    int i,j;
    int di=bull[x].dir;
    int xx,yy;
    for(i=1;;i++)
    {
        xx=bull[x].x+i*dir1[di][0]*bull[x].v;
        yy=bull[x].y+i*dir1[di][1]*bull[x].v;
        if(xx<0||xx>n||yy<0||yy>m) break;
        if(map[xx][yy][0]) break;
        int flag=0;
        if(di==0)
        {
            for(j=xx;j<bull[x].x;j++)
            if(map[j][bull[x].y][0]) {flag=1;break;}
        }
        else if(di==1)
        {
            for(j=bull[x].y+1;j<=yy;j++)
            if(map[bull[x].x][j][0]) {flag=1;break;}
        }
        else if(di==2)
        {
            for(j=bull[x].x+1;j<=xx;j++)
            if(map[j][bull[x].y][0]){flag=1;break;}
        }
        else if(di==3)
        {
            for(j=yy;j<bull[x].y;j++)
            if(map[bull[x].x][j][0]) {flag=1;break;}
        }
        if(flag) break;
        j=0;
        int t=i;
        while(t<=d)
        {
            map[xx][yy][t]=1;
            j++;
            t=i+j*bull[x].t;
        }
    }
    return 0;
}
int bfs()
{
    a.x=0;
    a.y=0;
    a.tt=0;
    memset(mark,0,sizeof(mark));
    queue<node>q;
    mark[a.x][a.y][a.tt]=1;
    q.push(a);
    int i,j;
    int flash=0;
    while(!q.empty())
    {
        b=q.front();
        q.pop();
        //printf("%d %d\n",b.x,b.y);
        if(b.x==n&&b.y==m)
        {
            printf("%d\n",b.tt);
            flash=1;
            break;
        }
        for(i=0;i<5;i++)
        {
            a.x=b.x+dir[i][0];
            a.y=b.y+dir[i][1];
            a.tt=b.tt+1;
            if(n-a.x+m-a.y>d-a.tt) continue;
            if(a.x<0||a.x>n||a.y<0||a.y>m) continue;
            if(map[a.x][a.y][0]) continue;
            if(map[a.x][a.y][a.tt]==0&&mark[a.x][a.y][a.tt]==0)
            {
                mark[a.x][a.y][a.tt]=1;
                q.push(a);
            }
        }
    }
    if(!flash) printf("Bad luck!\n");
    return 0;
}
int main()
{
    int i,j;
    while(~scanf("%d%d%d%d",&n,&m,&k,&d))
    {
        char str[2];
        memset(map,0,sizeof(map));
        for(i=1;i<=k;i++)
        {
            scanf("%s",str);
            if(str[0]==‘N‘) bull[i].dir=0;
            else if(str[0]==‘E‘) bull[i].dir=1;
            else if(str[0]==‘S‘) bull[i].dir=2;
            else if(str[0]==‘W‘)bull[i].dir=3;
            scanf("%d%d",&bull[i].t,&bull[i].v);
            scanf("%d%d",&bull[i].x,&bull[i].y);
            map[bull[i].x][bull[i].y][0]=1;
        }

        for(i=1;i<=k;i++)
        {
            deal(i);
        }
        bfs();
    }
    return 0;
}    
时间: 2024-10-10 12:59:09

hdu 3533 搜索+预处理的相关文章

50道hdu基础搜索总结(转)

Dfs: 大部分是直接递归枚举,即求满足约束条件下的解,虽不用剪枝,但也需要代码能力. 练习递归枚举的题目: 1241       Oil Deposits (dfs的连通块个数) 1016       Prime Ring Problem 1584       蜘蛛牌(简单dfs,简单的剪枝,还有人用DP做(???)) 1426       Sudoku Killer(练习递归的好题目 or Dancing links(???)) 2510       符号三角形(打表题,写写打表程序还是不错

hdu 5887 搜索+剪枝

Herbs Gathering Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 687    Accepted Submission(s): 145 Problem Description Collecting one's own plants for use as herbal medicines is perhaps one of t

【搜索】 HDU 3533 Escape BFS 预处理

要从0,0 点 跑到m,n点  路上会有k个堡垒发射子弹,有子弹的地方不能走,子弹打到别的堡垒就会消失,或者一直飞出边界(人不能经过堡垒 可以上下左右或者站着不动 每步都需要消耗能量  一共有eng个能量 先预处理出地图 用三维数组表示mp[x][y][time] time表示该时间的地图上储存不能走的点 然后就是普通BFS #include <stdio.h> #include <string.h> #include <stdlib.h> #include <s

HDU 3533 Escape(BFS+预处理)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3533 题目大意:给你一张n* m的地图,人在起点在(0,0)要到达终点(n,m)有k(k<=100)座炮台,每座炮台都有各自的发射方向.发射周期和发射速度,每隔一段时间会发射一定速度的炮弹,人每秒可以选择停在原地或者往上下左右走,问是否能在时间d之内安全到达终点.如果可以,请输出最短时间. 解题思路:BFS+预处理,分为以下几点: ①预处理,用step[x][y][t]记录(x,y)在时间t是否被炮

HDU 3533 Escape BFS搜索

题意:懒得说了 分析:开个no[100][100][1000]的bool类型的数组就行了,没啥可说的 #include <iostream> #include <cstdio> #include <vector> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <queue> #include

HDU 3533 Escape (BFS + 预处理)

Escape Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 541    Accepted Submission(s): 141 Problem Description The students of the HEU are maneuvering for their military training. The red army

HDU 3567 BFS+预处理

HDU 1043的加强版 8数码问题 给出8数码问题的两种状态,求从A状态到B状态的最优解,数据保证有解,若有多解,输出最短且字典序最小的. 基本思路和1043的差不多,只不过这次要预处理出来9种情况的BFS 即: BFS(0,"012345678"); BFS(1,"102345678"); BFS(2,"120345678"); BFS(3,"123045678"); BFS(4,"123405678"

poj 1198 hdu 1401 搜索+剪枝 Solitaire

写到一半才发现可以用双向搜索4层来写,但已经不愿意改了,干脆暴搜+剪枝水过去算了. 想到一个很水的剪枝,h函数为  当前点到终点4个点的最短距离加起来除以2,因为最多一步走2格,然后在HDU上T了,又发现再搜索过程中,这个估价函数应该是递减的(贪心),再加上这个剪枝就过了. #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<list> #

hdu 4848 搜索+剪枝 2014西安邀请赛

http://acm.hdu.edu.cn/showproblem.php?pid=4848 比赛的时候我甚至没看这道题,其实不难.... 但是说实话,现在对题意还是理解不太好...... 犯的错误: 1.floy循环次序写错, 2.搜索的时候,应该先判断i是不是可以搜(就是可不可能产生解),然后标记vis[i]=1,我二逼的先标记vis[i]=1,然后判断i是不是可搜,这样肯定会导致有些时候,cnt!=n 我的剪枝方法(2546MS AC): 搜下一个结点之前,确保时间小于所有的未访问的结点的