Vladik and Favorite Game CodeForces - 811D (思维+BFS+模拟+交互题)
2 seconds
256 megabytes
standard input
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!
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.
You can press buttons no more than 2·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 x, y — 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 n, m — 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.
4 3
...
**.
F*.
...
1 1
1 2
1 3
1 3
2 3
3 3
4 3
4 2
4 1
3 1
R
L
L
D
U
U
U
R
R
D
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=;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int n,m;
int lrfan=;
int upfan=;
int lrok=;
int upok=;
int x,y;
char a[][];
pii pre[][];
void ask(int iiix)
{
// 1 2 3 4
// u d l r
if(iiix==)
{
if(upfan)
{
printf("D\n");
}else
{
printf("U\n");
}
}else if(iiix==)
{
if(upfan==)
{
printf("D\n");
}else
{
printf("U\n");
}
}else if(iiix==)
{
if(lrfan)
{
printf("R\n");
}else
{
printf("L\n");
}
}else
{
if(lrfan==)
{
printf("R\n");
}else
{
printf("L\n");
}
}
fflush(stdout);
scanf("%d %d",&x,&y);
}
int xx[]={,,-,};
int yy[]={,-,,};
int vis[][];
int main()
{
scanf("%d %d",&n,&m);
repd(i,,n)
{
scanf("%s",a[i]+);
}
queue<pii> q;
pre[][]=mp(-,-);
q.push(mp(,));
vis[][]=;
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=;i<=;i++)
{
int gx=temp.fi+xx[i];
int gy=temp.second+yy[i];
if(gx>=&&gx<=n&&gy>=&&gy<=m&&vis[gx][gy]==&&a[gx][gy]=='.'||a[gx][gy]=='F')
{
q.push(mp(gx,gy));
vis[gx][gy]=;
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!=-)
{
path.push((pre[ex][ey]));
int tx=pre[ex][ey].first;
int ty=pre[ex][ey].second;
ex=tx;
ey=ty;
} int flag=;
x=;
y=;
path.pop();
path.pop();
while(flag)
{
temp=path.top();
path.pop();
int dx=x-temp.first;
int dy=y-temp.se;
if(dx==-&&dy==)
{
// 1 2 3 4
// u d l r
ask();
if(x!=temp.first||y!=temp.se)
{
upfan=;
ask();
} }else if(dx==&&dy==)
{
ask();
if(x!=temp.first||y!=temp.se)
{
upfan=;
ask();
}
}else if(dx==&&dy==-)
{
ask();
if(x!=temp.first||y!=temp.se)
{
lrfan=;
ask();
}
}else if(dx==&&dy==)
{
ask();
if(x!=temp.first||y!=temp.se)
{
lrfan=;
ask();
}
}
if(x==-||y==-||a[x][y]=='F')
{
flag=;
}
} return ;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '');
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * - ch + '';
}
}
else {
*p = ch - '';
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * + ch - '';
}
}
}
Vladik and Favorite Game CodeForces - 811D (思维+BFS+模拟+交互题)的更多相关文章
- Vladik and Complicated Book CodeForces - 811B (思维实现)
Vladik had started reading a complicated book about algorithms containing n pages. To improve unders ...
- Codeforces 438D (今日gg模拟第二题) | 线段树 考察时间复杂度的计算 -_-|||
Codeforces 438D The Child and Sequence 给出一个序列,进行如下三种操作: 区间求和 区间每个数模x 单点修改 如果没有第二个操作的话,就是一棵简单的线段树.那么如 ...
- Codeforces 1254C/1255F Point Ordering (交互题)
题目链接 http://codeforces.com/contest/1254/problem/C 题解 sb题. 第一次,通过\((n-2)\)次询问2确定\(p[2]\),也就是从\(1\)来看& ...
- Codeforces 631A Interview【模拟水题】
题意: 模拟模拟~~ 代码: #include<iostream> using namespace std; const int maxn = 1005; int a[maxn], b[m ...
- codeforces 1019B The hat 【交互题+二分搜索】
题目链接:戳这里 学习题解:戳这里
- Codeforces 1137D - Cooperative Game - [交互题+思维题]
题目链接:https://codeforces.com/contest/1137/problem/D 题意: 交互题. 给定如下一个有向图: 现在十个人各有一枚棋子(编号 $0 \sim 9$),在不 ...
- Codeforces Round #523 (Div. 2) F. Katya and Segments Sets (交互题+思维)
https://codeforces.com/contest/1061/problem/F 题意 假设存在一颗完全k叉树(n<=1e5),允许你进行最多(n*60)次询问,然后输出这棵树的根,每 ...
- BFS+模拟 ZOJ 3865 Superbot
题目传送门 /* BFS+模拟:dp[i][j][p] 表示走到i,j,方向为p的步数为多少: BFS分4种情况入队,最后在终点4个方向寻找最小值:) */ #include <cstdio&g ...
- Codeforces Round #378 (Div. 2) D题(data structure)解题报告
题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...
随机推荐
- Java(Java SE7) 体系结构图
原文:https://docs.oracle.com/javase/7/docs/
- 【Git 学习三】深入理解git reset 命令
重置命令(git reset)是Git 最常用的命令之一,也是最危险最容易误用的命令.来看看git reset命令用法. --------------------------------------- ...
- 什么是JDK?什么是JRE?JDK与JRE的区别和用途
一.编程环境与运行环境 JDK(Java Development Kit)称为Java开发包或Java开发工具.是一个编写Java的Applet小程序和应用程序的程序开发环境.JDK是整个Java的核 ...
- 企业级仓库harbor搭建
1.Harbor是什么? Harbor是Vmvare中国团队开发的开源registry仓库,相比docker官方拥有更丰富的权限权利和完善的架构设计,适用大规模docker集群部署提供仓库服务.在企业 ...
- JavaScript -- 时光流逝(十三):DOM -- Console 对象
JavaScript -- 知识点回顾篇(十三):DOM -- Console 对象 (1) assert() : 如果断言为 false,则在信息到控制台输出错误信息.(2) clear() : 清 ...
- VMware安装系统时"无法创建新虚拟机: 不具备执行此操作的权限"的解决方案
作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在VMware中安装操作系统时,遇到以下这种情况 问题主要出在虚拟机文件的位置选择上,不应该选在VMwa ...
- DB2常见错误信息
000 00000 SQL语句成功完成01xxx SQL语句成功完成,但是有警告+012 01545 未限定的列名被解释为一个有相互联系的引用+098 01568 动态SQL语句用分号结束+100 0 ...
- Fluentd初探 简介与安装
Fluentd是一个开源的数据收集器,专为处理数据流设计,有点像 syslogd ,但是使用JSON作为数据格式.它采用了插件式的架构,具有高可扩展性高可用性,同时还实现了高可靠的信息转发. 据分(Y ...
- 解决IE8不支持html5标签最好解决办法?
完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法:HTML5的语义化标签以及属性,可以让开发者非常方便地实现清晰的web页面布局,加上CSS3的效果渲染,快速建立丰富灵活的web页面显 ...
- Mysql的用户管理