【分类讨论】【spfa】【BFS】Codeforces Round #416 (Div. 2) D. Vladik and Favorite Game
那个人第一步肯定要么能向下走,要么能向右走。于是一定可以判断出上下是否对调,或者左右是否对调。
然后他往这个方向再走一走就能发现一定可以再往旁边走,此时就可以判断出另一个方向是否对调。
都判断出来以后,跑个spfa或者bfs就行了。
细节较多……有一些边界情况需要处理。比如终点在第一行或者第一列的情况。
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
typedef pair<int,int> Point;
Point ma[110*110*10];
const int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int n,m,End;
char a[110][110];
int num[110][110],pen;
queue<int>Q;
int dis[110*110*10],v[110*110*4*10],e,__next[110*110*4*10],first[110*110*10];
int pre[110*110*10];
bool inq[110*110*10];
void AddEdge(int U,int V){
v[++e]=V;
__next[e]=first[U];
first[U]=e;
}
void spfa(const int &s)
{
memset(dis,0x7f,sizeof(dis));
dis[s]=0; Q.push(s); inq[s]=1;
while(!Q.empty())
{
int U=Q.front();
for(int i=first[U];i;i=__next[i])
if(dis[v[i]]>dis[U]+1)
{
dis[v[i]]=dis[U]+1;
pre[v[i]]=U;
if(!inq[v[i]])
{
Q.push(v[i]);
inq[v[i]]=1;
}
}
Q.pop(); inq[U]=0;
}
}
Point path[110*110*10];
int p;
bool lr,ud;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%s",a[i]+1);
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
num[i][j]=++pen;
ma[pen]=make_pair(i,j);
if(a[i][j]=='F'){
End=num[i][j];
}
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)if(a[i][j]=='.' || a[i][j]=='F'){
for(int k=0;k<4;++k){
int tx=i+dx[k],ty=j+dy[k];
if(a[tx][ty]=='.' || a[tx][ty]=='F'){
AddEdge(num[i][j],num[tx][ty]);
}
}
}
} if(End==1){
return 0;
}
int x,y;
if((a[2][1]=='*' || n==1) && (a[1][2]=='.' || a[1][2]=='F')){
puts("R");
fflush(stdout);
scanf("%d%d",&x,&y);
if(x==1 && y==1){
lr=1;
}
while(a[x][y]!='F' && a[x+1][y]=='*'){
puts(lr ? "L" : "R");
fflush(stdout);
scanf("%d%d",&x,&y);
}
if(a[x][y]=='F'){
return 0;
}
puts("D");
fflush(stdout);
scanf("%d%d",&x,&y);
if(a[x][y]=='F'){
return 0;
}
if(x==1){
ud=1;
}
}
else if((a[1][2]=='*' || m==1) && (a[2][1]=='.' || a[2][1]=='F')){
puts("D");
fflush(stdout);
scanf("%d%d",&x,&y);
if(x==1 && y==1){
ud=1;
}
while(a[x][y]!='F' && a[x][y+1]=='*'){
puts(ud ? "U" : "D");
fflush(stdout);
scanf("%d%d",&x,&y);
}
if(a[x][y]=='F'){
return 0;
}
puts("R");
fflush(stdout);
scanf("%d%d",&x,&y);
if(a[x][y]=='F'){
return 0;
}
if(y==1){
lr=1;
}
}
else if((a[1][2]=='.' || a[1][2]=='F') && (a[2][1]=='.' || a[2][1]=='F')){
puts("R");
fflush(stdout);
scanf("%d%d",&x,&y);
if(x==1 && y==1){
lr=1;
puts("D");
fflush(stdout);
scanf("%d%d",&x,&y);
if(num[x][y]==End){
return 0;
}
if(x==1 && y==1){
ud=1;
}
}
else{
if(num[x][y]==End){
return 0;
}
puts("L");
fflush(stdout);
scanf("%d%d",&x,&y);
puts("D");
fflush(stdout);
scanf("%d%d",&x,&y);
if(num[x][y]==End){
return 0;
}
if(x==1 && y==1){
ud=1;
}
}
} spfa(num[x][y]);
int U=End;
while(U!=num[x][y]){
path[++p]=ma[U];
U=pre[U];
}
path[++p]=ma[num[x][y]];
for(int i=p;i>1;--i){
if(path[i-1].first-path[i].first==1){
puts(ud ? "U" : "D");
fflush(stdout);
scanf("%d%d",&x,&y);
}
if(path[i-1].first-path[i].first==-1){
puts(ud ? "D" : "U");
fflush(stdout);
scanf("%d%d",&x,&y);
}
if(path[i-1].second-path[i].second==1){
puts(lr ? "L" : "R");
fflush(stdout);
scanf("%d%d",&x,&y);
}
if(path[i-1].second-path[i].second==-1){
puts(lr ? "R" : "L");
fflush(stdout);
scanf("%d%d",&x,&y);
}
}
return 0;
}
【分类讨论】【spfa】【BFS】Codeforces Round #416 (Div. 2) D. Vladik and Favorite Game的更多相关文章
- Codeforces Round #416 (Div. 2) D. Vladik and Favorite Game
地址:http://codeforces.com/contest/811/problem/D 题目: D. Vladik and Favorite Game time limit per test 2 ...
- Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip
http://codeforces.com/contest/811/problem/C 题意: 给出一行序列,现在要选出一些区间来(不必全部选完),但是相同的数必须出现在同一个区间中,也就是说该数要么 ...
- 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
划分那个序列,没必要完全覆盖原序列.对于划分出来的每个序列,对于某个值v,要么全都在该序列,要么全都不在该序列. 一个序列的价值是所有不同的值的异或和.整个的价值是所有划分出来的序列的价值之和. ...
- 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 ...
- DFS/BFS Codeforces Round #301 (Div. 2) C. Ice Cave
题目传送门 /* 题意:告诉起点终点,踩一次, '.'变成'X',再踩一次,冰块破碎,问是否能使终点冰破碎 DFS:如题解所说,分三种情况:1. 如果两点重合,只要往外走一步再走回来就行了:2. 若两 ...
- BFS Codeforces Round #297 (Div. 2) D. Arthur and Walls
题目传送门 /* 题意:问最少替换'*'为'.',使得'.'连通的都是矩形 BFS:搜索想法很奇妙,先把'.'的入队,然后对于每个'.'八个方向寻找 在2*2的方格里,若只有一个是'*',那么它一定要 ...
- Codeforces Round#416 Div.2
A. Vladik and Courtesy 题面 At regular competition Vladik and Valera won a and b candies respectively. ...
- Codeforces Round #416 (Div. 2) A+B
A. Vladik and Courtesy 2 seconds 256 megabytes At regular competition Vladik and Valera won a and ...
随机推荐
- O(1)时间复杂度实现入栈、出栈、获得栈中最小元素、获得栈中最大元素(转)
题目要求:定义栈的数据结构,添加min().max()函数(动态获取当前状态栈中的最小元素.最大元素),要求push().pop().min().max()的时间复杂度都是O(1). 思路解析:根据栈 ...
- 【Android framework】AndroidManagerService初始化流程
源码基于Android 4.4. system_server的初始化 system_server受AMS管理,负责启动framework-res.apk和SettingsProvider.apk. ...
- binlog_server备份binlogs
在主库上建一个复制用的账号: root@localhost [(none)]>grant replication slave on *.* to 'wyz'@'%' identified by ...
- Jmeter性能测试示例
这次成功做了一个jmeter借口性能测试的简单测试示例,分享一下给大家. jmeter作为一个简单的开源工具,基于java的性能测试工具,使用起来很简单. 也可以作为二次开发,复杂的情形可以自己写代码 ...
- 阿里云ftp连接遇到的错误,entering passive mode失败(一个并不成熟的产品?)
####禁止自行转载 ####违者必究 ####需要转载请联系我 因为最近用python写了一个自动上传的脚本,想通过FTP把数据上传到我的服务器. 于是, 兴高采烈地打开我一直信任的阿里云,yum ...
- django “如何”系列10:如何管理静态文件
django开发者最关心的是web应用中的动态部分-视图函数和模板.但是明显,web应用还有其他需要注意的部分:静态文件(图片,css,javascript等等),那些都是渲染一个完整的页面需要的东西 ...
- html,图片上传预览,input file获取文件等相关操作
input file常用方法: var obj=document.getElementById("upimage"); var file=obj.files[0];//获取文件数据 ...
- http通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤
http通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: (1) 建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成 ...
- git 修改 本地分支名称
http://www.yiibai.com/git/git_managing_branches.html 重命名分支 假设需要在项目中添加对宽字符的支持.并且已经创建了一个新的分支,但分支名称需要重新 ...
- LeetCode解题报告—— 4Sum & Remove Nth Node From End of List & Generate Parentheses
1. 4Sum Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + ...