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

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

1

30 31 95

S..............................

..X............................

...X...........................

....X..........................

.....X.........................

......X........................

.......X.......................

........X......................

.........X.....................

..........X....................

...........X...................

............X..................

.............X.................

..............X................

...............X...............

................X..............

.................X.............

..................X............

...................X...........

....................X..........

.....................X.........

......................X........

.......................X.......

........................X......

.........................X.....

..........................X....

...........................X...

............................X..

.............................XE

..............................D

结果是88,如果这组数据能过那就没问题了.

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n,m,t;
char mapp[105][105];
int visit[105][105][2][2];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int dx,dy,ex,ey,sx,sy;
int re;
int flag1,flag2;
struct stu
{
    int x,y,s;
    int flag1,flag2;
};
int judgee(int x,int y)
{
    int flag=0;
    if(x==ex)
    {
        int nn=min(y,ey),mm=max(y,ey);
        int sum=0;
        for(int i=nn+1;i<mm;i++)
        {
            if(mapp[x][i]=='.') sum++;
        }
        if(sum==(mm-nn-1)) flag=1;
    }
    if(y==ey)
    {
        int nn=min(x,ex),mm=max(x,ex);
        int sum=0;
        for(int i=nn+1;i<mm;i++)
        {
            if(mapp[i][y]=='.') sum++;
        }
        if(sum==(mm-nn-1)) flag=1;
    }
    return flag;
}
int judged(int x,int y)
{
    int flag=0;
    if(x==dx)
    {
        int nn=min(y,dy),mm=max(y,dy);
        int sum=0;
        for(int i=nn+1;i<mm;i++)
        {
            if(mapp[x][i]=='.') sum++;
        }
        if(sum==(mm-nn-1)) flag=1;
    }
    if(y==dy)
    {
        int nn=min(x,dx),mm=max(x,dx);
        int sum=0;
        for(int i=nn+1;i<mm;i++)
        {
            if(mapp[i][y]=='.') sum++;
        }
        if(sum==(mm-nn-1)) flag=1;
    }
    return flag;
}
void bfs()
{
    stu x,y;
    queue<stu>root;
    x.x=sx;x.y=sy;x.s=0;x.flag1=0;x.flag2=0;
    root.push(x);
    if(judgee(x.x,x.y)) x.flag1=1;
    if(judged(x.x,x.y)) x.flag2=1;
    visit[x.x][x.y][x.flag1][x.flag2]=1;
    while(root.size())
    {
        x=root.front();
        //cout<<x.x<<x.y<<endl;
        if(judgee(x.x,x.y)) x.flag1=1;
        if(judged(x.x,x.y)) x.flag2=1;
        //cout<<x.x<<x.y<<x.flag1<<x.flag2<<endl;
        if(x.flag1&&x.flag2) {re=x.s;return;}
        root.pop();
        for(int i=0;i<4;i++)
        {
            y.x=x.x+dir[i][0];
            y.y=x.y+dir[i][1];
            y.flag1=x.flag1;
            y.flag2=x.flag2;
            y.s=x.s+1;
            if(y.x<0||y.x>=n||y.y<0||y.y>=m||visit[y.x][y.y][y.flag1][y.flag2]||mapp[y.x][y.y]!='.'||y.s>t){continue;}
            root.push(y);
            visit[y.x][y.y][y.flag1][y.flag2]=1;
        }
    }
}
int main()
{
    int u,p;
    cin>>u;
    for(int p=0;p<u;p++)
    {
        cin>>n>>m>>t;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cin>>mapp[i][j];
                if(mapp[i][j]=='S') sx=i,sy=j;
                if(mapp[i][j]=='E') ex=i,ey=j;
                if(mapp[i][j]=='D') dx=i,dy=j;
               // visit[i][j]=-1;
            }
        }
        memset(visit,0,sizeof(visit));
        mapp[sx][sy]='.';
        re=-1;
        bfs();
        cout<<"Case "<<p+1<<":"<<endl;
        cout<<re<<endl;
    }
    return 0;
}
时间: 2024-10-10 22:15:21

hdu 4528 小明系列故事——捉迷藏的相关文章

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

广搜. 根据题意,可以知道状态总共有$4*n*m$种.每一个位置四种状态:两个都没有发现:发现$E$没发现$D$:发现$D$没发现$E$:两个都发现. 每次移动的花费都是$1$,队列里面状态的费用是单调不减的,所以第一次符合要求的位置就是答案. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath&g

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之后,就开始潜心研究数学问题了,一则可以为接下来的考研做准备,再者可以借此机会帮助一些同学,尤其是漂亮的师妹.这不,班