很久没有发题解,今天这题卡了下百度没看到相关题解,最后还是看了官方题解才找到原本思路的bug过的。

题意:给出一个二维迷宫,*表示墙,. 表示路,X表示起点,问一个长度为k的路径,从X出发并且回到X,且路径字典序最小。如存在输出路径(方向按U、D、L、R表示,英文首字母),不存在则输出IMPOSSIBLE。

解题思路(wa在第49个case):

显然按照字典序,方向优先级D>L>R>U。随便弄了几组样例发现通常情况下,当所走路径长度达到一半的时候,原路返回比绕一个圈更优,比如LLUDRR优于LLURRD,于是很草率的决定后一半的路径全为原路返回。

特殊判断当k为奇数或者四个方向都无法前往时输出IMPOSSIBLE。

wa了后先是想了比较久都没找到反例,看了官方题解后一下子就找到了,如下:(原本反例有误,已修正)

..X.
....
....
....
.**.
....
*b..

按上面的算法,当走到"b"的时候,因为路径长度计数到9,也就是18的一半,开始原路返回(即下一步为U),但其实再往右、右、上、上、上……(下一步为R)更优,且路径长度亦为18。

思路纠正:

先广搜出X到所有其它点的最短距离,遍历点时按优先级访问,当下一点到起点的最短距离大于k-cnt时,跳过。

先是奇怪地CE了一发,原因是queue<pair<int,int>>q;这句定义报错,两个>符号要分开。(好吧vs上面没有这个问题,语言编译系统不一样)

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
#define sqr(x) ((x)*(x))
const int N=1e3+;
int n,m,k,cnt,x,y,tx,ty,dis[N][N];
int dx[]={,,,-},dy[]={,-,,};
char g[N][N],res[N*N],dir[]="DLRU";
bool vis[N][N];
queue<pair<int,int>>q;
bool check(int tx,int ty){
return tx>=&&tx<n&&ty>=&&ty<m&&g[tx][ty]!='*';
}
void init(){
memset(vis,,sizeof(vis));
while(!q.empty()) q.pop();
q.push(make_pair(x,y));
vis[x][y]=true;
while(!q.empty()){
pair<int,int>tmp=q.front();q.pop();
int tx=tmp.first,ty=tmp.second;
for(int i=;i<;i++){
int nx=tx+dx[i],ny=ty+dy[i];
if(check(nx,ny)&&!vis[nx][ny]){
q.push(make_pair(nx,ny));
dis[nx][ny]=dis[tx][ty]+;
vis[nx][ny]=true;
}
}
}
}
int main(){
//freopen("in.txt","r",stdin);
while(~scanf("%d%d%d",&n,&m,&k)){
cnt=;
for(int i=;i<n;i++){
scanf("%s",g[i]);
for(int j=;j<m;j++) if(g[i][j]=='X')
x=i,y=j;
}
if(k&){
puts("IMPOSSIBLE");
continue;
}
init();
bool flag=true;
while(flag){
flag=false;
for(int i=;i<;i++){
tx=x+dx[i],ty=y+dy[i];
if(check(tx,ty)&&dis[tx][ty]<=k-cnt){
flag=true;
res[cnt++]=dir[i];
x=tx,y=ty;
break;
}
}
if(cnt==k) break;
}
if(!flag) puts("IMPOSSIBLE");
else{
res[k]='\0';
puts(res);
}
}
return ;
}

Codeforces 769C的更多相关文章

  1. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  2. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  3. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  4. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  5. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  6. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  7. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  8. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

  9. CodeForces - 148D Bag of mice

    http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...

随机推荐

  1. Android jdbc连接mysql报错解决方案 (Communications link failure)

    最近调试安卓连接mysql真是心态爆炸,快两天才搞出来.以下整理一些常见问题. 检查manifest文件里网络权限是否打开 检查数据库IP是否有问题(包括一些沙雕错误,比如是不是在ip首或尾多了个空格 ...

  2. Authors and instutes in MCT

    Authors and instutes in MCT Table of Contents 1. Authors and Institutes 1.1. Industry 1 Authors and ...

  3. 【模板】Lca倍增法

    Codevs 1036 商务旅行 #include<cstdio> #include<cmath> #include<algorithm> using namesp ...

  4. mysql 查询出的数组为null怎么转换成0

    mysql 查询出的数组为null怎么转换成0 IFNULL(b.dayPay,0) as yesterdayPay,

  5. 分块试水--CODEVS5037 线段树练习4加强版

    感觉这才算入门题吧..前面那些线段树练习,改几个字符就过了一定要搞成几道题.. n<=2e5的数列,给常数K<=2e5,m<=2e5个操作,区间加,问一个区间里K的倍数. 这题空间? ...

  6. codevs1174 靶形数独

    题目描述 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士 ...

  7. Alcatel OmniSwitch 重置密码

    OmniSwitch 6250重置密码 Press s to STOP AT MINIBOOT... [Miniboot]->cd "network" value = 0 = ...

  8. 5分钟Serverless实践 | 构建无服务器图片鉴黄Web应用

    Serverless是什么 Serverless中文译为“无服务器”,最早可以追溯到2012年Ken Fromm发表的<Why The Future Of Software And Apps I ...

  9. 利用jQuery Ajax技术实现每隔5秒向某页面传值

    有时候我们须要每隔一段时间向某页面传值,比方说聊天室,每隔几秒就像数据库处理页面传值并取回,然后显示在聊天窗体.又或者是每隔一段时间就查询用户最后发言时间到如今是否间隔2分钟.假设是则将用户退出. 这 ...

  10. keepalived+nginx安装配置

    软件版本号: pcre8.36 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz keepalived1.2 ...