Vladik and Favorite Game CodeForces - 811D (思维+BFS+模拟+交互题)

D. Vladik and Favorite Game
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

This is an interactive problem.

Vladik has favorite game, in which he plays all his free time.

Game field could be represented as n × m matrix which consists of cells of three types:

  • «.» — normal cell, player can visit it.
  • «F» — finish cell, player has to finish his way there to win. There is exactly one cell of this type.
  • «*» — dangerous cell, if player comes to this cell, he loses.

Initially player is located in the left top cell with coordinates (1, 1).

Player has access to 4 buttons "U", "D", "L", "R", each of them move player up, down, left and right directions respectively.

But it’s not that easy! Sometimes friends play game and change functions of buttons. Function of buttons "L" and "R" could have been swapped, also functions of buttons "U" and "D" could have been swapped. Note that functions of buttons can be changed only at the beginning of the game.

Help Vladik win the game!

Input

First line contains two space-separated integers n and m (1 ≤ n, m ≤ 100) — number of rows and columns respectively.

Each of next n lines contains m characters describing corresponding row of field. Set of characters in field is described above.

Guaranteed that cell with coordinates (1, 1) is normal and there is at least one way from initial cell to finish cell without dangerous cells.

Interaction

You can press buttons no more than n·m times.

To press a button you should print "U", "D", "L", "R" in new line. It’s necessary to print newline character and flush output. After flushing buffer you should read answer from input data. Answer is the pair of space-separated integers xy — new position of player. In case, if there is no cell in direction of moving, position will not change. If after any move player lost, in other words player move to dangerous cell, then x and y will be equal to  - 1.

If after any move player is in finish or dangerous cell, then you should terminate your program.

To finish output buffer (i. e. for operation flush) right after printing direction and newline you should do next:

  • fflush(stdout) in C++
  • System.out.flush() in Java
  • stdout.flush() in Python
  • flush(output) in Pascal
  • read documentation for other languages.

Hacks

To perform a hack you should use this format:


n m swapLR swapUD
a_1
a_2
...
a_n

Where nm — number of rows and columns in game field. swapLR is equal to 1 in case, when directions "L’’ and "R’’ is swapped, and equal to 0 otherwise. swapUD is equal to 1, when directions "U’’ and "D’’ is swapped, and equal to 0 otherwise. a1, a2, ..., an — description of corresponding rows of game field.

Example
input
Copy
4 3
...
**.
F*.
...
1 1
1 2
1 3
1 3
2 3
3 3
4 3
4 2
4 1
3 1
output
Copy
R
L
L
D
U
U
U
R
R
D
Note

In first test case all four directions swapped with their opposite directions. Protocol of interaction In more convenient form:

This test could be presenter for hack in following way:


4 3 1 1
...
**.
F*.
...

题意:

现在给你一个n*m大小的图,你输出一个方向之后,系统反馈给你一个坐标,表示走完这步之后到的位子,我们需要在2*n*m步之内走到终点,问怎样走才行(多解输出任意一个即可)。

我们一开始的位子是(1,1),终点位子是“F”,‘*’表示不能走的位子,游戏开始的时候,有一些小伙伴比较调皮,会将U和D互换,就是说假设我们操作了U,但是实际是走到了D.或者也可能将L和R互换,当然也可能都没有互换过,当然也可能都互换过。

然你模拟整个过程。

思路:

先根据迷宫用bfs找出一个可行路径,用pre[][]的二维数组来记录bfs中每一个位置的上一个位置。

然后从终点位置根据pre找到起点,中间的路径信息都加入栈中,然后从起点开始用栈的路径信息走向重点,

路上每一次输出一个方向的时候,如果走的结果和预期结果不一样,那么判定这个方向被恶搞了,我们做出相应的调整。

然后就根据出栈的信息一路走到终点了。

本题主要是细节过多,而且输出方向导致代码量较大,加上是交互题写起来不是很简单,希望大家多理解思路。

我的代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"==  "<<x<<"  =="<<endl;
using namespace std;
typedef long long ll;
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int n,m;
int lrfan=0;
int upfan=0;
int lrok=0;
int upok=0;
int x,y;
char a[150][150];
pii pre[150][150];
void ask(int iiix)
{
    // 1 2 3 4
    // u d l r
    if(iiix==1)
    {
        if(upfan)
        {
            printf("D\n");
        }else
        {
            printf("U\n");
        }
    }else if(iiix==2)
    {
        if(upfan==0)
        {
            printf("D\n");
        }else
        {
            printf("U\n");
        }
    }else if(iiix==3)
    {
        if(lrfan)
        {
            printf("R\n");
        }else
        {
            printf("L\n");
        }
    }else
    {
        if(lrfan==0)
        {
            printf("R\n");
        }else
        {
            printf("L\n");
        }
    }
    fflush(stdout);
    scanf("%d %d",&x,&y);
}
int xx[]={0,0,-1,1};
int yy[]={1,-1,0,0};
int vis[150][150];
int main()
{
    scanf("%d %d",&n,&m);
    repd(i,1,n)
    {
        scanf("%s",a[i]+1);
    }
    queue<pii> q;
    pre[1][1]=mp(-1,-1);
    q.push(mp(1,1));
    vis[1][1]=1;
    pii temp;
    int ex,ey;
    while(!q.empty())
    {
        temp=q.front();
        q.pop();
        if(a[temp.first][temp.second]=='F')
        {
            ex=temp.first;
            ey=temp.second;
            break;
            // over
        }
        for(int i=0;i<=3;i++)
        {
            int gx=temp.fi+xx[i];
            int gy=temp.second+yy[i];
            if(gx>=1&&gx<=n&&gy>=1&&gy<=m&&vis[gx][gy]==0&&a[gx][gy]=='.'||a[gx][gy]=='F')
            {
                q.push(mp(gx,gy));
                vis[gx][gy]=1;
                pre[gx][gy]=temp;
            }
        }

    }
    // repd(i,1,n)
    // {
    //     repd(j,1,m)
    //     {
    //         printf("[ %d %d ] ",pre[i][j].first,pre[i][j].second);
    //     }
    //     printf("\n");
    // }
    stack<pii> path;
     path.push(mp(ex,ey));
    while(ex!=-1)
    {
        path.push((pre[ex][ey]));
        int tx=pre[ex][ey].first;
        int ty=pre[ex][ey].second;
        ex=tx;
        ey=ty;
    }

    int flag=1;
    x=1;
    y=1;
    path.pop();
    path.pop();
    while(flag)
    {
        temp=path.top();
        path.pop();
        int dx=x-temp.first;
        int dy=y-temp.se;
        if(dx==-1&&dy==0)
        {
             // 1 2 3 4
             // u d l r
            ask(2);
            if(x!=temp.first||y!=temp.se)
            {
                upfan=1;
                ask(2);
            }

        }else if(dx==1&&dy==0)
        {
             ask(1);
            if(x!=temp.first||y!=temp.se)
            {
                upfan=1;
                ask(1);
            }
        }else if(dx==0&&dy==-1)
        {
            ask(4);
            if(x!=temp.first||y!=temp.se)
            {
                lrfan=1;
                ask(4);
            }
        }else if(dx==0&&dy==1)
        {
            ask(3);
            if(x!=temp.first||y!=temp.se)
            {
                lrfan=1;
                ask(3);
            }
        }
         if(x==-1||y==-1||a[x][y]=='F')
            {
                flag=0;
            }
    }

    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}
 

猜你喜欢

转载自www.cnblogs.com/qieqiemin/p/10293769.html