HDU 4528 小明系列故事――捉迷藏

广搜。

根据题意,可以知道状态总共有$4*n*m$种。每一个位置四种状态:两个都没有发现;发现$E$没发现$D$;发现$D$没发现$E$;两个都发现。

每次移动的花费都是$1$,队列里面状态的费用是单调不减的,所以第一次符合要求的位置就是答案。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<ctime>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-10;
void File()
{
    freopen("D:\\in.txt","r",stdin);
    freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
    char c = getchar();
    x = 0;
    while(!isdigit(c)) c = getchar();
    while(isdigit(c))
    {
        x = x * 10 + c - ‘0‘;
        c = getchar();
    }
}

int T,n,m,t;
char s[105][105];
int sx,sy,ex,ey,dx,dy;
int dir[4][2]={ {-1,0},{1,0},{0,-1},{0,1} };
int f[2][105][105];
int dis[105][105][4];
int flag;

struct X
{
    int a,b,st;
    X(int A,int B,int ST)
    {
        a=A;
        b=B;
        st=ST;
    }
};

bool check(int a,int b)
{
    if(a<0||a>=n) return 0;
    if(b<0||b>=m) return 0;
    if(s[a][b]!=‘.‘) return 0;
    return 1;
}

void bfs()
{
    queue<X>Q; int st=f[0][sx][sy]*(1<<0)+f[1][sx][sy]*(1<<1);
    Q.push(X(sx,sy,st));  dis[sx][sy][st]=0;

    while(!Q.empty())
    {
        X h=Q.front(); Q.pop();
        if(h.st==3)
        {
            if(dis[h.a][h.b][h.st]<=t)
            {
                printf("%d\n",dis[h.a][h.b][h.st]);
                flag=1;
            }
            return ;
        }

        for(int i=0;i<4;i++)
        {
            int tx=h.a+dir[i][0],ty=h.b+dir[i][1];
            if(check(tx,ty)==0) continue;
            int tst = h.st;
            if(f[0][tx][ty]==1) tst=tst|(1<<0);
            if(f[1][tx][ty]==1) tst=tst|(1<<1);
            if(dis[tx][ty][tst]!=0x7FFFFFFF) continue;

            dis[tx][ty][tst]=dis[h.a][h.b][h.st]+1;
            Q.push(X(tx,ty,tst));
        }

    }
}

int main()
{
    scanf("%d",&T); int cas=1;
    while(T--)
    {
        scanf("%d%d%d",&n,&m,&t);
        for(int i=0;i<n;i++) scanf("%s",s[i]);

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(s[i][j]==‘S‘) sx=i,sy=j;
                if(s[i][j]==‘E‘) ex=i,ey=j;
                if(s[i][j]==‘D‘) dx=i,dy=j;

                for(int k=0;k<4;k++) dis[i][j][k]=0x7FFFFFFF;
                f[0][i][j]=f[1][i][j]=0;
            }
        }

        s[sx][sy]=‘.‘;

        for(int k=0;k<=1;k++)
        {
            int a,b;
            for(int i=0;i<4;i++)
            {
                if(k==0) a=ex,b=ey;
                else a=dx,b=dy;
                for(int j=0;;j++)
                {
                    a=a+dir[i][0], b=b+dir[i][1];
                    if(check(a,b)==0) break;
                    f[k][a][b]=1;
                }
            }
        }

        printf("Case %d:\n",cas++);
        flag=0; bfs();
        if(flag==0) printf("-1\n");
    }
    return 0;
}
时间: 2024-07-31 14:35:24

HDU 4528 小明系列故事――捉迷藏的相关文章

hdu 4528 小明系列故事——捉迷藏

一开始很疑惑自己为什么错了,后来才知道原来这题是可以往回 走的.开4维visit数组记录状态,状态不同则往回走,相同再往回走. 1 30 31 95 S.............................. ..X............................ ...X........................... ....X.......................... .....X......................... ......X........

hdu 4506 小明系列故事——师兄帮帮忙

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4506 题目大意:找规律,判断k的t次幂前面的系数. 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 __int64 fun(__int64 a,__int64 b) 6 { 7 __int64 s=1; 8 while (b) 9 { 10 if (b%2==1) 11 s=s*a%1000000

hdu 4511 小明系列故事——女友的考验

小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 822    Accepted Submission(s): 176 Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则

HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)

小明系列故事--女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1734    Accepted Submission(s): 466 Problem Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规

HDU - 4511 小明系列故事――女友的考验(AC自动机+DP)

Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则: 1.假设小明在的位置是1号点,女朋友在的位置是n号点,则他们之间有n-2个点可以走,小明每次走的时候只能走到比当前所在点编号大的位置: 2.小明来的时候不能按一定的顺序经过某些地方.比如,如果女朋友告诉小明不能经过1 -> 2 -> 3,那么就要求小明来的时候走过的路径不能包含有1 -> 2 ->

AC自动机 + 二维最短路 HDU 4511 小明系列故事――女友的考验

这个题还是比较好想的. 首先将所有不可行方案建立AC自动机,然后跑最短路. 首先将小明放在(sta = 0,pos = 0)处,sta表示AC自动机上点的编号,pos表示坐标点的编号. 根据pos枚举下一次可以到达的地方[pos+1,n],然后sta在自动机上移动,如果某一步会使sta位于有标记的节点,那么这一步是不可行. #include <iostream> #include<time.h> #include<stdio.h> #include<string.

hdu 4542 &quot;小明系列故事——未知剩余系&quot; (反素数+DFS剪枝)

传送门 参考资料: [1]:https://blog.csdn.net/acdreamers/article/details/25049767 题意: 输入两个数 type , k: ①type = 0,求[1,262]中的因子个数为 k 的反素数,如果求解的答案 > 262,输出"INF": ②type = 1,求使得 num-factor[num] = k 的最小的num: 题解: 只有当 type = 1 时,才有可能输出 "Illegal": 那,什么

HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)题解

题意:从 1 走到 n,要求所走路径不能出现给定的路径,求最短路 思路:因为要求不能出现给定路径,那么我可以求助ac自动机完成判断. 我们可以在build的时候标记哪些路径不能出现,显然下面这种表示后缀不能出现,那么他也不能出现 if(node[node[u].fail].cnt && u) node[u].cnt = 1; //都不能取 然后再把图建完整.因为如果一个路径不在Trie中有两种情况,一种是他可能是某个不能走的串的前缀,那么我就重新指向这个不能走的串,比如Trie中只有AT,

HDU 小明系列故事——师兄帮帮忙 快速幂

小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 4850    Accepted Submission(s): 1275 Problem Description 小明自从告别了ACM/ICPC之后,就开始潜心研究数学问题了,一则可以为接下来的考研做准备,再者可以借此机会帮助一些同学,尤其是漂亮的师妹.这不,班