zoukankan      html  css  js  c++  java
  • CodeForces 811D Vladik and Favorite Game bfs,模拟

    CodeForces 811D

    题意:交互式问题。 n*m 的图,'F'为终点,'.'为路,'*'为墙,一开始人在点(1,1),要走到 'F' 。 你可以操控人走,但左右和上下可能会交换,即你操控走左边,有可能是走向右边。 题目保证只在一开始会交换方向。

    你操控人走向哪边,会返回下一个点的坐标给你。

    tags: SB题,就是先 bfs 记录下来,再走一遍就是了。 但这题主要写起来有点烦。。

    //  811D
    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define rep(i,a,b) for (int i=a; i<=b; ++i)
    #define per(i,b,a) for (int i=b; i>=a; --i)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    #define MP make_pair
    #define PB push_back
    #define fi  first
    #define se  second
    #define PII  pair<int, int >
    typedef long long ll;
    const int N = 105;
    
    int n, m;
    PII  f[N][N];
    bool vis[N][N];
    char s[N][N];
    int xx[4]={0,0,1,-1}, yy[4]={-1,1,0,0};
    void bfs(int x, int y)
    {
        queue<PII > q;
        q.push(MP(x,y));  vis[x][y]=true;
        while(!q.empty())
        {
            PII  u=q.front(),  to;
            q.pop();
            rep(i,0,3)
            {
                to.fi=u.fi+xx[i], to.se=u.se+yy[i];
                if(to.fi>0 && to.se>0 && to.fi<=n && to.se<=m)
                    if(!vis[to.fi][to.se] && s[to.fi][to.se]=='.')
                {
                    vis[to.fi][to.se]=true;
                    f[to.fi][to.se]=u;
                    q.push(to);
                }
            }
        }
    }
    char ch[5]={'#', 'L', 'R', 'U', 'D' };
    int Dir(int x1, int y1, int x2, int y2)
    {
        if(x1-1==x2 && y1==y2) return 3;
        if(x1+1==x2 && y1==y2) return 4;
        if(x1==x2 && y1+1==y2) return 2;
        if(x1==x2 && y1-1==y2) return 1;
    }
    bool lr, ud;
    int Rev(int flag)
    {
        if(flag==1) return 2;
        if(flag==2) return 1;
        if(flag==3) return 4;
        if(flag==4) return 3;
    }
    int fx, fy;
    void solve(int x, int y)
    {
        if(x==fx && y==fy) return ;
        int tx, ty, x2=f[x][y].fi,  y2=f[x][y].se;
        int flag = Dir(x, y, x2, y2),  flag2 = Rev(flag);
        printf("%c
    ", ch[flag]);     fflush(stdout);
        scanf("%d%d", &tx, &ty);
        if(tx!=x2 || ty!=y2)
        {
            if(tx!=x || ty!=y)
            {
                printf("%c
    ", ch[flag2]);  fflush(stdout);
                scanf("%d%d", &tx, &ty);
            }
    
            if(flag==1 || flag==2) swap(ch[1], ch[2]);
            if(flag==3 || flag==4) swap(ch[3], ch[4]);
        }
        solve(tx, ty);
    }
    int main()
    {
        scanf("%d%d", &n, &m);
        rep(i,1,n)
        {
            scanf("%s", s[i]+1);
            rep(j,1,m)
                if(s[i][j]=='F')
                   fx=i, fy=j;
        }
        bfs(fx, fy);
        solve(1, 1);
    
        return 0;
    }
  • 相关阅读:
    JavaWeb学习总结(十三)——使用Session防止表单重复提交
    JavaWeb学习总结(十二)——Session
    eclipse中复制servlet导致tomcat启动不了的问题
    javaweb学习总结(十一)——使用Cookie进行会话管理
    EL表达式
    request.getParameter() 和request.getAttribute() 区别
    javaweb学习总结(十)——HttpServletRequest对象(一)
    javaweb学习总结(九)—— 通过Servlet生成验证码图片
    javaweb学习总结(八)——HttpServletResponse对象(二)
    javaweb学习总结(七)——HttpServletResponse对象(一)
  • 原文地址:https://www.cnblogs.com/sbfhy/p/7688194.html
Copyright © 2011-2022 走看看