【学校集训】【USACO15DecG】Bessie's Dream
点此进入原题
(注:上面的参考译文是有问题的,等一下会在题解中说明)
算法:最短路或搜索(BFS)
题解:
本题用最短路可以做,但是构图比较麻烦,搜索要相对简单一点。
搜索需要四个量表示状态:(x,y)坐标,一个bool型变量表示是否有橘子味,还有一个量来表示方向(处理紫色方块时要用)
对于当前状态,如果前一个状态所在坐标代表紫色瓷砖并且可以继续滑行(按原方向下一个坐标所代表的不是粉红色或蓝色瓷砖),那么你就要继续按照原方向滑行。
否则就枚举4个方向然后按照相应情况判断是否有橘子味,之后就是朴素的BFS了~
重要:本题的读题坑
1. 在紫色瓷砖上滑行一次也要步数+1,即使滑到的下一个仍然是紫色瓷砖。
在参考译文中写的“一次滑行无论通过多少瓷砖只算一次移动”显然是不对的,因为原文是"Sliding through a tile counts as a move",即滑行一个瓷砖算一次移动,而不是无论多少瓷砖。这句话本身好像也通不过去啊……
2. 在初始状态(1,1)的步数应该是0
在老师讲题的时候说(1,1)的步数应该是1,老师给的AC代码貌似初始步数也是1,但是我写的AC代码初始步数是0,并且如果初始步数是1的话那么对于第4个测试点会有矛盾。推算原题的意思应该也是初始步数为0.不过对于老师的代码能AC我还是表示十分惊奇的
后来发现老师的代码里好像有ans-1?好玄学啊
下面是代码时间:
#include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int N=1005; int n,m,a[N][N]; int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; struct Node {int x,y,d;bool orange; }; queue<Node> q; int step[N][N][5][3]; bool check(Node f) {int x=dx[f.d]+f.x,y=dy[f.d]+f.y;return a[x][y]!=0&&a[x][y]!=3; } int main() {freopen("dream.in","r",stdin);freopen("dream.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);memset(step,-1,sizeof(step));step[1][1][0][0]=step[1][1][2][0]=0; //初始步数为0q.push((Node){1,1,0,false}); //方向为向下或向右q.push((Node){1,1,2,false});while(!q.empty()){Node f=q.front();q.pop();for(int i=0;i<4;i++){int x=f.x+dx[i],y=f.y+dy[i];if(x<1||y<1||x>n||y>m||a[x][y]==0) continue;if(!f.orange&&a[x][y]==3) continue;if(a[f.x][f.y]==4&&check(f)) //处理前一个是4的情况(我直接放在循环内部了) {if(i!=f.d) continue; //方向要相同bool o;if(a[x][y]==2) o=true;else o=false;if(step[x][y][i][o]==-1){step[x][y][i][o]=step[f.x][f.y][i][f.orange]+1; //滑行步数要+1 q.push((Node){x,y,i,o});}}else{bool o;if(a[x][y]==2) o=1;else if(a[x][y]==4) o=0;else o=f.orange;if(step[x][y][i][o]!=-1) continue;step[x][y][i][o]=step[f.x][f.y][f.d][f.orange]+1;q.push((Node){x,y,i,o});}}}int ans=1<<30;for(int i=0;i<4;i++)for(int j=0;j<=1;j++)if(step[n][m][i][j]!=-1)ans=min(ans,step[n][m][i][j]);printf("%d",ans==1<<30?-1:ans); }
这个代码在USACO上是能AC的,但是自测会TLE。解决办法是手写队列。然而我懒得手写了QWQ
彩蛋:贴代码的时候发现倒数第三行写的是max QAQ,或许数据中只有一条合法路径?(惊恐
转载于:https://www.cnblogs.com/farway17/p/6938048.html
【学校集训】【USACO15DecG】Bessie's Dream相关推荐
- Bessie‘s Dream
Bessie's Dream 题目来源:USACO 2015 December Contest Gold Bessie has broken into Farmer John's house agai ...
- HHTC_学校集训编程题目(13)(组队赛_3)
HHTC_学校集训编程题目(13)(组队赛_3) C - Wandering Robot G - Circle B - 迷宫寻宝 D - 给力的移动 E - 谁还不是个宝宝 K - Teamwork ...
- HHTC_学校集训编程题目(11)(组队赛_1)
HHTC_学校集训编程题目(11)(组队赛_1) B - Problem B. Memory Banks A - 小妖的下属 C - 巴啦啦能量 E - 貂蝉的试炼 F - 一品五彩棒 H - 丢失的 ...
- 2018.3.15校内互测总结-点分治-线段树
这是曾来过咱们学校集训的一位大神出的~ T1 题目大意 给出一棵带边权的无根树,求树上前$k$大的路径的长度. $1 \leq n \leq 200000$ 题解 想了一上午点分治,却发现只会$O(n ...
- 【最终省二】全国大学生数学建模大赛-参赛经历
前言/背景 当初知道这个比赛的时候还是在大一,那会刚上大学也不知道未来要干嘛,对自己的职业发展什么都不懂,每天除了上课就是在宿舍打游戏的,了解这个比赛是在一个晚上上高数课,老师叫我们积极参加,说这个比 ...
- 如何将此电脑放到桌面上(windows10版本)
如何将此电脑放到桌面上(windows10版本) 目录 一. 序言 二. 方法 三. 注意事项 一. 序言 今天到学校集训室装电脑,装完开机后发现桌面上没有此电脑.想到有些小伙伴可能新买的电脑也有 ...
- 两年数模路,一点小感触…
按:写于四年之前~ 前些时日小白给我打电话,说市场部的学弟准备参加mcm,想问点问题.我才猛然想起自己还参加过那么几次,也无怪乎天纯妹妹总给我发四字短信"建模先锋",甚是有聊.去年 ...
- 2020初升高暑假之末有感
文章目录 0.前言 1.暑期动作 2.今后打算 高中,新的起点,新的气象,梦想起飞的地方! 青春有梦,各自精彩! Just do it! 0.前言 转眼间,我已经一脚踏进了高中的大门,我知道这意味着什 ...
- 某天咸得无聊写的水题题面
<奇怪的题面>.jpg 某天被要求给初三的小朋友出题...身为一个已经彻底凉掉的人呢,还是要做一些微小的工作吧. 但是周围的神仙都在出毒瘤题,看着小朋友们做毒瘤题,感觉这样劝退大家可能真的 ...
- 2019暑期总结规划
文章目录 一些实话 最重要的--作业 一些吐槽和归纳 日程主要安排 对事件的一些期望 期末考试 纪中集训 长假 学校集训 短假 开学 一些插曲 总结们 一些实话 暑假的任务就两个:去集训和做作业(强制 ...
最新文章
- Django博客系统(文章分类模型)
- SCI录用的最后一步——答复审稿人的策略和答复信的写作技巧
- 替换url中的参数值
- java httpclient 关闭_java中使用httpclient如何关闭debug日志
- 重磅大礼!100本《机器学习》by周志华,免费送!
- miui12 android系统耗电,miui12耗电严重怎么办,miui12续航优化方法
- android 内存分析 郭霖_android 内存泄漏(OOM)问题总结
- Python爬虫项目---从wiley网站批量下载文章
- C语言学习笔记---结构体指针
- windows配置caffe及matlab/python接口编译和调用(cpu/gpu)
- redis的持久化(RDBAOF的区别)
- 分页插件之--kaminari
- 华为 荣耀 6x android哪个版本,华为荣耀畅玩6X官方rom刷机包_华为荣耀6X原版系统包_升级包...
- Oracle开发 之 主-外键约束FK及约束的修改
- 全球首次!32岁青年科学今天发现!道翰天琼认知智能机器人平台API接口大脑为您揭秘。
- Matlab/Simulink-PFC-Boost功率因数校正电路仿真搭建
- 阿里云域名实名认证操作图文详情 新人必看
- ora2og使用步骤
- civetweb学习
- NASA完成审查 下周三宇航员搭SpaceX载人龙飞船升空
热门文章
- 【渝粤教育】广东开放大学 商务翻译实务 形成性考核 (49)
- 在linux 或docker中使用 system.drawing.common
- 使用 IntelliJ IDEA打包Spark应用程序
- 【转】我的opengl编程学习(二)(混合、深度测试、雾化、
- 实例篇——springboot自定义拦截器
- 用Unity简单实现第三人称人物的移动和转向
- LeetCode(26): 删除排序数组中的重复项
- SVN提交时显示:Path is not a working copy directory
- eclipse中使用maven插件的时候,运行tomcat7:run的时候报错
- 基于Web的MIS系统环境配置和相关含义(拷贝版)