1 条题解
-
0
蒟蒻看见大部分题解都是搜索,这里提供一种代码较好写的思路qwq
upd 2024.04.08 改正了一个错别字
蒟蒻的心路历程
这题也太简单了吧!学 OI 两年半都看得出来是道搜索题!(干代码中)
……过了一会儿……
唉,代码干不动了,看一会儿题目。欸?石头只有一块?啊这……
于是,就有了这篇题解
首先,题目说有一个着火点(即起点)、一个石头(即障碍物)、一个湖(即终点),问起点到终点的最短路径要经过几格(不算终点、起点)。
我们来想一个类似贪心的算法:
设起点坐标为 ,终点坐标为 ,障碍物坐标为 。
由于障碍物只有一个,而两点之间路径却有很多条,所以路径长度肯定是:
(两个点到交点的长度和减去重复的交点)。
可是交上去后,发现蛙了 个点,只有 pts。
蒟蒻自我反省一会儿后,
马上发现了问题:如果数据是同行同列呢?此时,我们的公式会多减一,导致 WA。因此,加两个特判,分别判断同行(即 坐标相等)、同列(即 坐标相等)。交上去之后,发现另外两个点蛙了, pts(其实原来那份应该蛙 个的,但是这两个点答案刚好是 )。
这下蒟蒻想不出来了,
只好下载数据。结果脑瓜一拍,又发现了问题:咱的代码没判断障碍物是否在起点和终点之间!于是,特判中的特判横空出世——判断障碍物的列(行)坐标是否在起点和终点的列(行)坐标之间。这里再提一嘴,输入这种字符类型的地图用 getchar 函数会比较快,不过要在循环外再加一个,因为它不像 cin 那样过滤换行哦。
pts,愉快拿下!
Code
#include<bits/stdc++.h> using namespace std; char ch; int main() { int sx,sy,ex,ey,kx,ky;//定义变量 for(int i=1;i<=10;i++){ for(int j=1;j<=10;j++){ ch=getchar(); //getchar() if(ch=='B')sx=i,sy=j; if(ch=='R')kx=i,ky=j; if(ch=='L')ex=i,ey=j; } getchar();//读取换行 } if(sy==ky&&ky==ey&&kx<max(ex,sx)&&kx>min(ex,sx))cout<<abs(ex-sx)+1<<endl;//特判同行以及列坐标是否在起点和终点的列坐标之间 else if(sx==kx&&kx==ex&&ky<max(ey,sy)&&ky>min(ey,sy))cout<<abs(ey-sy)+1<<endl;//特判同列以及行坐标是否在起点和终点的行坐标之间 else cout<<abs(ex-sx)+abs(ey-sy)-1<<endl;//两个点到交点的长度和减去重复的交点 return 0;//不那么华丽的结尾(小声) }
- 1
信息
- ID
- 6939
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 71
- 已通过
- 10
- 上传者