明显这是一道搜索题,其他题解写的有点复杂,我有更简便的写法

既然题目说走到不能再走,那我们就干脆一点,一条路走到黑,不到南墙不回头,一下把要走的路都走完,不但效率高,也好写,关键是大大节省了系统栈

一口气走很多点的关键在于如何记录一个点是否遍历过呢?退出后又如何删除标记呢?

或许正是这两个问题使一些想到这种解法的人退缩了,但解决这种问题并不难。我们照常可以用一个二维数组记录一个点是否走过,再用一个栈来记录走过的点,退出时,将栈顶依次弹出就好

也许有人会说don't talk,show me your code.

当然是带着代码来的了,口胡可不是我的风格

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#define ll long long
#define gc getchar
#define maxn 125
#define maxm 15000
using namespace std; inline ll read(){
ll a=0;int f=0;char p=gc();
while(!isdigit(p)){f|=p=='-';p=gc();}
while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
return f?-a:a;
} struct ahaha{
int x,y;
}s[maxm]; //用一个栈来记录已便利的点的坐标 此处建议使用手写栈,而不是STL的栈
int n,m,ans,a[maxn][maxn]; //ans记录最多能走多少点,a数组表示当前点的状态,1为障碍或边界,0为未访问的点,1是已访问的点
const int xx[4]={1,0,-1,0},yy[4]={0,1,0,-1};
void dfs(int x,int y,int sum){ //x,y表示拐点坐标,sum表示走到当前点已走过的点数(包括当前点)
int s1=sum; //s1记录栈大小
for(int i=0;i<4;++i){
int xy=x+xx[i],yx=y+yy[i];
while(!a[xy][yx]){ //若节点可访问,则不断访问直到不能访问
s[++s1]=(ahaha){xy,yx};a[xy][yx]=2;
xy+=xx[i],yx+=yy[i];
}xy-=xx[i],yx-=yy[i]; //最后一个节点不可访问要往回走一个
if(xy==x&&yx==y)continue; //如果在原地没动要返回,避免死循环
ans=max(ans,s1); //ans利用栈大小赋值
if(a[xy+xx[i]][yx+yy[i]]!=2)dfs(xy,yx,s1); //如果下一个点不是已访问的点则继续前进
while(s1>sum){ //撤销标记,弹出栈顶
a[s[s1].x][s[s1].y]=0;
--s1;
}
}
} char c[5];
int main(){
n=read();m=read();
while(m--){
scanf("%s",c+1);int l=strlen(c+1),sum=0;
for(int i=2;i<=l;++i)
sum=(sum<<3)+(sum<<1)+(c[i]-48);
a[c[1]-'A'+1][sum]=1;
}
for(int i=1;i<=n;++i)
a[0][i]=a[n+1][i]=a[i][0]=a[i][n+1]=1;
a[1][1]=2;s[1]=(ahaha){1,1}; //记得把(1,1)放入栈中,如果不放,答案记得+1
dfs(1,1,1); //(1,1)如果不放就是dfs(1,1,0)
printf("%d\n",ans);
return 0;
}

怎么样是不是简洁又美观呢?喜欢的话,点个赞吧

谢谢您的观看

洛谷 P1560 蜗牛的旅行的更多相关文章

  1. 洛谷P1560 蜗牛的旅行

    题目 搜索,注意判断特殊情况,并且区分开什么时候转弯什么时候停止.然后转弯的时候更是要注意是否会进入障碍. #include <bits/stdc++.h> using namespace ...

  2. 洛谷P1027 Car的旅行路线

    洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...

  3. DP【洛谷P2134】 百日旅行

    [洛谷P2134] 百日旅行 题目背景 重要的不是去哪里,而是和你在一起.--小红 对小明和小红来说,2014年7月29日是一个美好的日子.这一天是他们相识100天的纪念日. (小明:小红,感谢你2场 ...

  4. 洛谷——P1560 [USACO5.2]蜗牛的旅行Snail Trails

    P1560 [USACO5.2]蜗牛的旅行Snail Trails 题目描述 萨丽·斯内尔(Sally Snail,蜗牛)喜欢在N x N 的棋盘上闲逛(1 < n <= 120). 她总 ...

  5. 洛谷 P1560 [USACO5.2]蜗牛的旅行Snail Trails(不明原因的scanf错误)

    P1560 [USACO5.2]蜗牛的旅行Snail Trails 题目描述 萨丽·斯内尔(Sally Snail,蜗牛)喜欢在N x N 的棋盘上闲逛(1 < n <= 120). 她总 ...

  6. 洛谷 P1560 [USACO5.2]蜗牛的旅行Snail Trails

    题目链接 题解 一看题没什么思路.写了个暴力居然可过?! Code #include<bits/stdc++.h> #define LL long long #define RG regi ...

  7. 洛谷P1522 牛的旅行 Cow Tours

    ---恢复内容开始--- P1522 牛的旅行 Cow Tours189通过502提交题目提供者该用户不存在标签 图论 USACO难度 提高+/省选-提交该题 讨论 题解 记录 最新讨论 输出格式题目 ...

  8. 洛谷 P4212 外太空旅行

    题目描述 在人类的触角伸向银河系的边缘之际,普通人上太空旅行已经变得稀松平常了.某理科试验班有n个人,现在班主任要从中选出尽量多的人去参加一次太空旅行活动. 可是n名同学并不是和平相处的.有的人,比如 ...

  9. 洛谷 P1027 Car的旅行路线

    P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路 ...

随机推荐

  1. js获取上月的最后一天

    一.问题: 在最近的开发中遇到一个需求,需要初始化默认时间为上月的最后一天 而在日历中这个值在每个月都不是固定的 二.分析: 问题可以转化为,获取指定月份时间的月末最后一天,下边是代码,供大家参考 f ...

  2. Azkaban系统的安装和分析。

    Azkaban系统是一个数据处理的很好用的工具,可以用来运行hadoop任务,管理hdfs,可以进行schedule任务调度,总体来说功能还是很强大的. 研究了一下azkaban,做了以下总结性的东西 ...

  3. 关于解决idea 输入法不跟随问题

    网上查了很多方法  自己试验了一种方式 jdk版本采用的是 java version "1.8.0_191"Java(TM) SE Runtime Environment (bui ...

  4. C# webapi 路由规则和接收数据

    1:新建的web api项目 默认的访问api方式:  (get,post,delect,put)  api+控制器  以Post为例子 post提交单个参数: 接收方法  post提交多个参数  接 ...

  5. Linux checksum flag in kernel

    net_device->feature | NETIF_F_NO_CSUM: No need to use L4 checksum, it used for loopback device. | ...

  6. 如何解决Django与Vue语法的冲突

    当我们在django web框架中,使用vue的时候,会遇到语法冲突.因为vue使用{{}},而django也使用{{}},因此会冲突. 解决办法1:在django1.5以后,加入了标签:{% ver ...

  7. SQL注入--显注和盲注中过滤逗号绕过

    SQL注入逗号绕过 1.联合查询显注绕过逗号 在联合查询时使用 UNION SELECT 1,2,3,4,5,6,7..n 这样的格式爆显示位,语句中包含了多个逗号,如果有WAF拦截了逗号时,我们的联 ...

  8. 001----Mysql隔离级别

    一:事务隔离级别 mysql数据库的隔离界别如下: 1, READ UNCOMMITTED(未提交读) 事务中的修改,即使没有提交,对其它事务也是可见的.  这样会造成脏读(Dirty Read)的问 ...

  9. 【MySQL解惑笔记】Mysql5.7.x无法开启二进制日志

    一.开启二进制日志 1)未开启二进制日志之前: mysql> show variables like 'log_bin'; +---------------+-------+ | Variabl ...

  10. 华为笔试——C++的int型数字位排序

    题目:int型数字位排序 题目介绍:输入int 型整数,按照从右至左的顺序,返回不含重复数字的新整数. 例: 输入: 99824270 输出: 072489 分析:乍一看很简单,但是很容易忽略int ...