zoj 3865 Superbot

题目的状态是比较少的,可以BFS一一个单位时间为一步,暴力化的搜索所有状况的。不熟悉这种类型,又被题目的条件吓到了,各种处理,结果却做不出来。

对于路径搜索或是其他采用bfs其每一步的花费可能不同时,可以采用优先队列,将一步分为多步走方法较好,能保持简单情况时的模型。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>

using namespace std;
const int msize=12;

struct node
{
    int h,l;
    int d,t;
}st;
node dir[5]={{-1,0},{1,0},{0,-1},{0,1}};

int vis[12][12][5][316];
int n,m,zp;
char map[msize][msize];

int bfs(node st)
{
    node to;
    queue<node> qu;
    qu.push(st);
    while(!qu.empty())
    {
        st=qu.front();qu.pop();

        int h=st.h,l=st.l,d=st.d,t=st.t;
        to.t=t+1;//到达时为下一秒
        to.h=h;to.l=l;
        if(to.t>=310)continue;
        if(st.t!=0&&zp!=0&&st.t%zp==0)//处理这一秒
            d=d==0?3:d-1;
        //不动
        to.d=d;
        if(!vis[to.h][to.l][to.d][to.t])
        {
            vis[to.h][to.l][to.d][to.t]=1;
            qu.push(to);
        }
        //左移
        to.d=d==0?3:d-1;
        if(!vis[to.h][to.l][to.d][to.t])
        {
            vis[to.h][to.l][to.d][to.t]=1;
            qu.push(to);
        }
        //右移
        to.d=d==3?0:d+1;
        if(!vis[to.h][to.l][to.d][to.t])
        {
            vis[to.h][to.l][to.d][to.t]=1;
            qu.push(to);
        }
        //按动
        to.h=h+dir[d].h,to.l=l+dir[d].l,to.d=d;
        if(0<=to.h&&to.h<n&&0<=to.l&&to.l<m
           &&map[to.h][to.l]!=‘*‘&&!vis[to.h][to.l][to.d][to.t])
        {
            if(map[to.h][to.l]==‘$‘)
                return to.t;
            vis[to.h][to.l][to.d][to.t]=1;
            qu.push(to);
        }
    }
    return -1;
}
int main(void)
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        scanf("%d %d %d",&n,&m,&zp);
        for(int i=0; i<n; i++)
        {
            scanf("%s",map[i]);
            for(int j=0; j<m; j++)
            {
                if(map[i][j]==‘@‘)
                {
                    st.h=i;
                    st.l=j;
                    st.d=2;
                    st.t=0;
                }
            }
        }
        vis[st.h][st.l][2][0]=1;
        int ans= bfs(st);
        if(ans==-1)
            printf("YouBadbad\n");
        else
            printf("%d\n",ans);
    }
    return 0;
}
/*
34
10 10 20
.******[email protected]
........**
......****
....******
.....*....
.....*....
....*.....
....*.$...
.*...*....
.*........

*/
时间: 2024-10-27 17:32:47

zoj 3865 Superbot的相关文章

BFS+模拟 ZOJ 3865 Superbot

题目传送门 1 /* 2 BFS+模拟:dp[i][j][p] 表示走到i,j,方向为p的步数为多少: 3 BFS分4种情况入队,最后在终点4个方向寻找最小值:) 4 */ 5 #include <cstdio> 6 #include <iostream> 7 #include <algorithm> 8 #include <cstring> 9 #include <string> 10 #include <queue> 11 usi

ZOJ 3865 Superbot BFS

地图很小,根据题意BFS Superbot Time Limit: 2 Seconds      Memory Limit: 65536 KB Superbot is an interesting game which you need to control the robot on an N*M grid map. As you see, it's just a simple game: there is a control panel with four direction left (1s

ZOJ 3865 Superbot(优先队列--模板)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5477 主要思路:1.从一个点(cur)到它相邻的点(next),所需要的时间数(t)其实是固定的,而且这个移动过程后,到达next时,相应的方向也是固定的,找到求t的办法就好了.    2.到达一个未到达的点可能有多条路,优先队列取时间最短的路,则答案最优 题目: Superbot Superbot is an interesting game which you

ZOJ 3865 Superbot BFS 搜索

不知道为什么比赛的时候一直想着用DFS 来写 一直想剪枝结果还是TLE = = 这题数据量不大,又是问最优解,那么一般来说是用 BFS 来写 int commandi[4] = {1, 2, 3, 4}; 我定义了一个方向数组,其实题目意思中的,指针移动还有操作版的变化本质上都是指针的移动 在此只需要 额外定义一个变量 cur 在数组 commandi 中循环移动即可 这道题目还是因为数据量不大吧,直接用 STL 中的 Queue 即可,优先队列肯定会更快. 总体来说,还是一道容易题. Sour

[bfs] zoj 3865 Superbot

题意: 给一个n*m的图. '@'代表你的位置,'.'代表空地,'*'代表墙,'$'代表钻石. 在每一秒钟你有四种选择. 1.站着不动. 2.光标往左移动一格. 3.光标往右移动一格. 4.点击光标让自己按光标的方向移动一格. 然后题目还给了一个k,代表每k秒光标整体循环右移一格. 现在问你拿到钻石的最少步数. 思路: 本弱开了一个四维数组判重use[x][y][f][l] 在(x,y)位置光标在f,面板移动了l次. 然后搜就可以了~ 代码: #include"stdio.h" #in

zoj 3865

Superbot Time Limit: 2 Seconds      Memory Limit: 65536 KB Superbot is an interesting game which you need to control the robot on an N*M grid map. As you see, it's just a simple game: there is a control panel with four direction left (1st position),

模拟3

    ID Origin Title 6 / 12 Problem A ZOJ 3860 Find the Spy 6 / 27 Problem B ZOJ 3861 Valid Pattern Lock     Problem C ZOJ 3862 Intersection   0 / 1 Problem D ZOJ 3863 Paths on the Tree     Problem E ZOJ 3864 Quiz for EXO-L     Problem F ZOJ 3865 Supe

概率dp ZOJ 3640

Help Me Escape Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 3640 Appoint description:  System Crawler  (2014-10-22) Description Background     If thou doest well, shalt thou not be accepted? an

zoj 2156 - Charlie&#39;s Change

题目:钱数拼凑,面值为1,5,10,25,求组成n面值的最大钱币数. 分析:dp,01背包.需要进行二进制拆分,否则TLE,利用数组记录每种硬币的个数,方便更新. 写了一个 多重背包的 O(NV)反而没有拆分快.囧,最后利用了状态压缩优化 90ms: 把 1 cents 的最后处理,其他都除以5,状态就少了5倍了. 说明:貌似我的比大黄的快.(2011-09-26 12:49). #include <stdio.h> #include <stdlib.h> #include <