Codeforces 769C
很久没有发题解,今天这题卡了下百度没看到相关题解,最后还是看了官方题解才找到原本思路的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的更多相关文章
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
- CodeForces - 148D Bag of mice
http://codeforces.com/problemset/problem/148/D 题目大意: 原来袋子里有w只白鼠和b只黑鼠 龙和王妃轮流从袋子里抓老鼠.谁先抓到白色老鼠谁就赢. 王妃每次 ...
随机推荐
- illuminate/routing 源码分析之注册路由
我们知道,在 Laravel 世界里,外界传进来一个 Request 时,会被 Kernel 处理并返回给外界一个 Response.Kernel 在处理 Request 时,会调用 illumina ...
- Xshell(smarTTY)连接Linux虚拟机失败(未开放22端口)解决办法
1.关闭防火墙: 命令:sudo ufw disable 2.安装openssh-server以及openssh-client: 命令:sudo apt-get install openssh-ser ...
- Linux 复习一
第一章 Linux简介和基本操作 一.Linux系统的来源和发展 Linux is a free Unix-type operating system originally created by Li ...
- [模拟赛FJOI Easy Round #2][T1 sign] (模拟+求字符串重复字串)
[题目描述] 小Z在无意中发现了一个神奇的OJ,这个OJ有一个神奇的功能:每日签到,并且会通过某种玄学的算法计算出今日的运势.在多次试验之后,小Z发现自己的运势按照一定的周期循环,现在他找到了你,请通 ...
- 如何使用loadrunner进行web网站性能测试
loadrunner压力测试原理 本质就是在loadrunner上模拟多个用户同时按固定行为访问web站点.其中固定行为在loadrunner中是通过录制脚本定义的,多个用户同时访问的策略是在load ...
- noip模拟赛 蒜头君救人
分析:之前的一道模拟赛题是dp+dfs,这道题是dp+bfs. 我们设f[stu][i][j]为当前状态为stu,走到(i,j)的答案,考虑怎么设计stu,每个人的状态有3种:要么在原地,要么被背着, ...
- 转载 - C - 枚举类型详解
出处:http://www.cnblogs.com/JCSU/articles/1299051.html 注:以下全部代码的执行环境为VC++ 6.0 在程序中,可能需要为某些整数定义一个别名,我们可 ...
- vue.js 利用组件之间通讯,写一个弹出框例子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【ZJOI2017 Round2练习&BZOJ4827】D1T3 gift(FFT)
题意: 思路:可以看出题目所要最小化的是这样一个形式: 拆出每一项之后发现会变化的项只有sigma a[i]*b[i+t]与c^2,c*(a[i]-b[i]) c可以在外层枚举,剩下的只有sigma ...
- UIColor用自定义颜色,TableView去掉背景色
1.用mac系统自带的数码测色计,选RGB模式,将值添加到ColorWithRed:xxx.0/255 最后的alpha选1.0 2.TableView的背景色要用setBackgroundView的 ...