Codeforces Round #416 (Div. 2) D. Vladik and Favorite Game
地址:http://codeforces.com/contest/811/problem/D
题目:
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*.
... 思路:
先跑一遍最短路,求出路径后先按正确方向走,如果返回的地点不对就是反向了。
Ps:然而还是t了几发,没看到上下反向和左右反向是分开的,盲人acmer
#include <bits/stdc++.h> using namespace std; #define MP make_pair
#define PB push_back
typedef long long LL;
typedef pair<int,int> PII;
const double eps=1e-;
const double pi=acos(-1.0);
const int K=1e6+;
const int mod=1e9+; int n,m;
int dx[]={,,,-};
int dy[]={,-,,};
char mp[][],ac[]={'U','D','L','R'};
PII dst,pre[][];
int vis[][];
void bfs(void)
{
queue<PII> q;
q.push(dst);
vis[dst.first][dst.second]=;
while(q.size())
{
PII u=q.front();q.pop();
if(u==MP(,))
return;
for(int i=;i<;i++)
{
int x=u.first+dx[i],y=u.second+dy[i];
if(x<=n&&x>=&&y<=m&&y>=&&mp[x][y]!='*'&&!vis[x][y])
pre[x][y]=u,q.push(MP(x,y)),vis[x][y]=;
}
}
}
int sc(PII &st,PII &se)
{
int l=se.first-st.first,r=se.second-st.second;
if(l==) return ;
else if(l==-) return ;
else if(r==) return ;
return ;
}
int main(void)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%s",&mp[i][]);
for(int j=;j<=m;j++)
if(mp[i][j]=='F')
dst=MP(i,j);
}
bfs();
int x,y,ans,cnt=;
bool op1=,op2=;
PII st,se;
st=MP(,);
while()
{
se=pre[st.first][st.second];
ans=sc(st,se);
if(op1 && ans==) ans=;
else if(op1 && ans==) ans=;
if(op2 && ans==) ans=;
else if(op2 && ans==) ans=;
printf("%c\n",ac[ans]);
fflush(stdout);
scanf("%d%d",&x,&y);
if(MP(x,y)!=se)
ans<=?op1=:op2=;
else
st=se;
if(MP(x,y)==dst)
break;
}
return ;
}
Codeforces Round #416 (Div. 2) D. Vladik and Favorite Game的更多相关文章
- Codeforces Round #416 (Div. 2) B. Vladik and Complicated Book
B. Vladik and Complicated Book time limit per test 2 seconds memory limit per test 256 megabytes inp ...
- Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip
http://codeforces.com/contest/811/problem/C 题意: 给出一行序列,现在要选出一些区间来(不必全部选完),但是相同的数必须出现在同一个区间中,也就是说该数要么 ...
- Codeforces Round #416 (Div. 2) A. Vladik and Courtesy【思维/模拟】
A. Vladik and Courtesy time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- 【分类讨论】【spfa】【BFS】Codeforces Round #416 (Div. 2) D. Vladik and Favorite Game
那个人第一步肯定要么能向下走,要么能向右走.于是一定可以判断出上下是否对调,或者左右是否对调. 然后他往这个方向再走一走就能发现一定可以再往旁边走,此时就可以判断出另一个方向是否对调. 都判断出来以后 ...
- 【动态规划】 Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip
划分那个序列,没必要完全覆盖原序列.对于划分出来的每个序列,对于某个值v,要么全都在该序列,要么全都不在该序列. 一个序列的价值是所有不同的值的异或和.整个的价值是所有划分出来的序列的价值之和. ...
- Codeforces Round #384 (Div. 2) E. Vladik and cards 状压dp
E. Vladik and cards 题目链接 http://codeforces.com/contest/743/problem/E 题面 Vladik was bored on his way ...
- Codeforces Round #384 (Div. 2) C. Vladik and fractions 构造题
C. Vladik and fractions 题目链接 http://codeforces.com/contest/743/problem/C 题面 Vladik and Chloe decided ...
- Codeforces Round #384 (Div. 2) A. Vladik and flights 水题
A. Vladik and flights 题目链接 http://codeforces.com/contest/743/problem/A 题面 Vladik is a competitive pr ...
- Codeforces Round #416 (Div. 2)(A,思维题,暴力,B,思维题,暴力)
A. Vladik and Courtesy time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...
随机推荐
- 查看SQLServer数据库每个表占用的空间大小
创建存储过程: CREATE PROCEDURE [dbo].[sys_viewTableSpace] AS BEGIN SET NOCOUNT ON; CREATE TABLE [dbo].#tab ...
- ACM计算几何模板——二维几何基础(基本运算,点和线,多边形)
/*==========================*\ | 计算几何基础函数 | | 1.点和向量的定义 | | 2.向量的基本运算 | | 3.点积 | | 4.向量长度 | | 5.两向量角 ...
- hdu 1025:Constructing Roads In JGShining's Kingdom(DP + 二分优化)
Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65 ...
- jQuery实现瀑布流布局详解(PC和移动端)
首先我们将如下样式的若干个单元写进body中,并将“box”向左浮动: <div class="box"> <img class="img" ...
- js函数柯里化
function curry(fn){ // 代码 } function add(a,b,c){ return a + b + c; } const execAdd = curry(add); exe ...
- XAML 中使用空格键(空白字符)
默认情况下,XAML折叠所有空白,这意味着包含空格.tab 键以及回车的长字符串将被转换为单个空格.而且,如果在一个元素内容之前或之后添加空白,这个空格将被完全忽略. 有时这并不是所期望的结果.例如, ...
- Linq循环DataTable,使用匿名对象取出需要的列
var g_id = context.Request["g_id"]; DataTable dt = new DataTable(); var sql = @"selec ...
- JQuery------制作div模态框
转载: http://blog.csdn.net/li_xiao_ming/article/details/6738922 如图: 代码: html(使用opacity的话content无法变为不透明 ...
- iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片
在调试接口的时候,遇到一个问题,就是多张图片上传的时候,不管我上传多少张,只会上传成功最后一张,也就是说只有一张图片上传成功了,针对这个问题,通过查找资料,找到了原因,首先,在上传的过程中,我们获取到 ...
- ionic触摸事件
官方文档:http://ionicframework.com/docs/api/directive/onHold/ on-hold 长按事件on-tap 点击事件 on-double-tap 双击事 ...