点此进入原题

(注:上面的参考译文是有问题的,等一下会在题解中说明)

算法:最短路或搜索(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相关推荐

  1. Bessie‘s Dream

    Bessie's Dream 题目来源:USACO 2015 December Contest Gold Bessie has broken into Farmer John's house agai ...

  2. HHTC_学校集训编程题目(13)(组队赛_3)

    HHTC_学校集训编程题目(13)(组队赛_3) C - Wandering Robot G - Circle B - 迷宫寻宝 D - 给力的移动 E - 谁还不是个宝宝 K - Teamwork ...

  3. HHTC_学校集训编程题目(11)(组队赛_1)

    HHTC_学校集训编程题目(11)(组队赛_1) B - Problem B. Memory Banks A - 小妖的下属 C - 巴啦啦能量 E - 貂蝉的试炼 F - 一品五彩棒 H - 丢失的 ...

  4. 2018.3.15校内互测总结-点分治-线段树

    这是曾来过咱们学校集训的一位大神出的~ T1 题目大意 给出一棵带边权的无根树,求树上前$k$大的路径的长度. $1 \leq n \leq 200000$ 题解 想了一上午点分治,却发现只会$O(n ...

  5. 【最终省二】全国大学生数学建模大赛-参赛经历

    前言/背景 当初知道这个比赛的时候还是在大一,那会刚上大学也不知道未来要干嘛,对自己的职业发展什么都不懂,每天除了上课就是在宿舍打游戏的,了解这个比赛是在一个晚上上高数课,老师叫我们积极参加,说这个比 ...

  6. 如何将此电脑放到桌面上(windows10版本)

    如何将此电脑放到桌面上(windows10版本) 目录 一. 序言 二. 方法 三. 注意事项 一. 序言   今天到学校集训室装电脑,装完开机后发现桌面上没有此电脑.想到有些小伙伴可能新买的电脑也有 ...

  7. 两年数模路,一点小感触…

    按:写于四年之前~ 前些时日小白给我打电话,说市场部的学弟准备参加mcm,想问点问题.我才猛然想起自己还参加过那么几次,也无怪乎天纯妹妹总给我发四字短信"建模先锋",甚是有聊.去年 ...

  8. 2020初升高暑假之末有感

    文章目录 0.前言 1.暑期动作 2.今后打算 高中,新的起点,新的气象,梦想起飞的地方! 青春有梦,各自精彩! Just do it! 0.前言 转眼间,我已经一脚踏进了高中的大门,我知道这意味着什 ...

  9. 某天咸得无聊写的水题题面

    <奇怪的题面>.jpg 某天被要求给初三的小朋友出题...身为一个已经彻底凉掉的人呢,还是要做一些微小的工作吧. 但是周围的神仙都在出毒瘤题,看着小朋友们做毒瘤题,感觉这样劝退大家可能真的 ...

  10. 2019暑期总结规划

    文章目录 一些实话 最重要的--作业 一些吐槽和归纳 日程主要安排 对事件的一些期望 期末考试 纪中集训 长假 学校集训 短假 开学 一些插曲 总结们 一些实话 暑假的任务就两个:去集训和做作业(强制 ...

最新文章

  1. Django博客系统(文章分类模型)
  2. SCI录用的最后一步——答复审稿人的策略和答复信的写作技巧
  3. 替换url中的参数值
  4. java httpclient 关闭_java中使用httpclient如何关闭debug日志
  5. 重磅大礼!100本《机器学习》by周志华,免费送!
  6. miui12 android系统耗电,miui12耗电严重怎么办,miui12续航优化方法
  7. android 内存分析 郭霖_android 内存泄漏(OOM)问题总结
  8. Python爬虫项目---从wiley网站批量下载文章
  9. C语言学习笔记---结构体指针
  10. windows配置caffe及matlab/python接口编译和调用(cpu/gpu)
  11. redis的持久化(RDBAOF的区别)
  12. 分页插件之--kaminari
  13. 华为 荣耀 6x android哪个版本,华为荣耀畅玩6X官方rom刷机包_华为荣耀6X原版系统包_升级包...
  14. Oracle开发 之 主-外键约束FK及约束的修改
  15. 全球首次!32岁青年科学今天发现!道翰天琼认知智能机器人平台API接口大脑为您揭秘。
  16. Matlab/Simulink-PFC-Boost功率因数校正电路仿真搭建
  17. 阿里云域名实名认证操作图文详情 新人必看
  18. ora2og使用步骤
  19. civetweb学习
  20. NASA完成审查 下周三宇航员搭SpaceX载人龙飞船升空

热门文章

  1. 【渝粤教育】广东开放大学 商务翻译实务 形成性考核 (49)
  2. 在linux 或docker中使用 system.drawing.common
  3. 使用 IntelliJ IDEA打包Spark应用程序
  4. 【转】我的opengl编程学习(二)(混合、深度测试、雾化、
  5. 实例篇——springboot自定义拦截器
  6. 用Unity简单实现第三人称人物的移动和转向
  7. LeetCode(26): 删除排序数组中的重复项
  8. SVN提交时显示:Path is not a working copy directory
  9. eclipse中使用maven插件的时候,运行tomcat7:run的时候报错
  10. 基于Web的MIS系统环境配置和相关含义(拷贝版)