1 条题解

  • 0
    @ 2026-5-19 0:31:58

    蒟蒻看见大部分题解都是搜索,这里提供一种代码较好写的思路qwq

    upd 2024.04.08 改正了一个错别字

    题目传送门

    蒟蒻的心路历程

    这题也太简单了吧!学 OI 两年半都看得出来是道搜索题!(干代码中)

    ……过了一会儿……

    唉,代码干不动了,看一会儿题目。欸?石头只有一块?啊这……

    于是,就有了这篇题解

    首先,题目说有一个着火点(即起点)、一个石头(即障碍物)、一个湖(即终点),问起点到终点的最短路径要经过几格(不算终点、起点)。

    我们来想一个类似贪心的算法:

    设起点坐标为 (sx,sy)(sx,sy),终点坐标为 (ex,ey)(ex,ey),障碍物坐标为 (kx,ky)(kx,ky)

    由于障碍物只有一个,而两点之间路径却有很多条,所以路径长度肯定是:

    (exsx)+(eysy)1|(ex-sx)|+|(ey-sy)|-1

    (两个点到交点的长度和减去重复的交点)。

    可是交上去后,发现蛙了 33 个点,只有 7070 pts。

    蒟蒻自我反省一会儿后,马上发现了问题:如果数据是同行同列呢?此时,我们的公式会多减一,导致 WA。因此,加两个特判,分别判断同行(即 xx 坐标相等)、同列(即 yy 坐标相等)。

    交上去之后,发现另外两个点蛙了,8080 pts(其实原来那份应该蛙 55 个的,但是这两个点答案刚好是 22)。

    这下蒟蒻想不出来了,只好 下载数据。结果脑瓜一拍,又发现了问题:咱的代码没判断障碍物是否在起点和终点之间!于是,特判中的特判横空出世——判断障碍物的列(行)坐标是否在起点和终点的列(行)坐标之间。

    这里再提一嘴,输入这种字符类型的地图用 getchar 函数会比较快,不过要在循环外再加一个,因为它不像 cin 那样过滤换行哦。

    100100 pts,愉快拿下!

    Code

    AC 记录

    #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
    上传者