[USACO5.2]蜗牛的旅行Snail Trails

嘛,这是博客里第一道dfs吧。

题目描述

萨丽·斯内尔(Sally Snail,蜗牛)喜欢在N x N 的棋盘上闲逛(1 < n <= 120)。

她总是从棋盘的左上角出发。棋盘上有空的格子(用“.”来表示)和B 个路障(用“#”来表示)。

下面是这种表示法的示例棋盘:

萨丽总是垂直(向上或者向下)或水平(向左或者向右)地走。她可以从出发地(总是记作A1 )向下或者向右走。一旦萨丽选定了一个方向,她就会一直走下去。如果她遇到棋盘边缘或者路障,她就停下来,并且转过90 度。她不可能离开棋盘,或者走进路障当中。并且,萨丽从不跨过她已经经过的格子。当她再也不能走的时候,她就停止散步。

这里是上面的棋盘上的一次散步路线图示:

萨丽向右走,再向下,向右,向下,然后向左,再向上,最后向右走。这时她遇到了一个她已经走过的格子,她就停下来了。但是,如果她在F5 格遇到路障后选择另外一条路——向我们看来是左边的方向转弯,情况就不一样了。

你的任务是计算并输出,如果萨丽聪明地选择她的路线的话,她所能够经过的最多格子数。

输入输出格式

输入格式:

输入的第一行包括N —棋盘的大小,和B —路障的数量(1 <= B <= 200)。接下来的B 行包含着路障的位置信息。下面的样例输入对应着上面的示例棋盘。下面的输出文件表示问题的解答。注意,当N > 26 时,输入文件就不能表示Z 列以后的路障了。(这句话不用专门理他。其实就是从A 的ascii 码开始向后顺延,不管是什么字母就行了。)

输出格式:

输出文件应该只由一行组成,即萨丽能够经过的最多格子数。

输入输出样例

输入样例#1:

8 4
E2
A6
G1
F5

输出样例#1:

33

题解

刚开始看到这个题时,第一感觉是bfs;但是想了一想,这个题的状态只能存图,无法状态压缩,所以bfs队列根本存不开状态,故无法使用bfs。
仔细考虑这道题,发现数据范围为 N <= 120,感觉不能搜索;但是考虑到只有走到头才能产生真正有效的状态(即使这样bfs也存不下,但dfs存一或两个二维图与有关坐标就够了),所以有效状态并不多,也考虑不到其他更有效的方法,所以果断上dfs。详情请见代码(๑•̀ㅂ•́)و✧
代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;int n;
int b;
int map[127][127] = {0};  //记录障碍物
int vis[217][127];  //记录自己走过的路
int dx[] = {0, 1, -1, 0, 0};
int dy[] = {0, 0, 0, 1, -1};
int ans = -1;
int x_l, y_l;template<class T>void read(T &x)  //读入优化
{int f = 0; x = 0; char ch = getchar();while(ch < '0' || ch > '9') f |= (ch == '-'), ch = getchar();while(ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();x = f? -x : x;
}
void write(int x)  //输出优化
{if(x < 0) putchar('-'), x = -x;if(x > 9) write(x / 10);putchar(x % 10 + '0');
}
int dfs_max(int &a, int &b){return a > b? a : b;}  //手写比较函数void dfs(int x_x, int y_x, int dir, int bushu) //dfs
{if(vis[x_x][y_x]) //如果撞到自己则记录步数dfs_max{ans = dfs_max(ans, bushu);return;}vis[x_x][y_x] = 1;  //标记x_l = x_x + dx[dir];  //尝试移动y_l = y_x + dy[dir];if(map[x_l][y_l])for(int i = 1; i <= 4; i++){if(i == dir) continue;  //注意这里需要向3个方向搜索,若想只从左右两个方向搜索,则需每次记录dfs_max或在撞墙后也记录dfs_max(请读者们想象一下从起点开始走完全图也没有撞到自己的情况)x_l = x_x + dx[i];  //尝试转向y_l = y_x + dy[i];if(!map[x_l][y_l])dfs(x_l, y_l, i, bushu + 1);  //转向}else  dfs(x_l, y_l, dir, bushu + 1);  //直走vis[x_x][y_x] = 0;  //回溯}int main()
{read(n);read(b); //输入int c_1;char c_2;for(int i = 1; i <= b; i++){cin >> c_2;  //这里推荐用cin,因为输入的字符超过ASCII码范围,用scanf或getchar()会比较不(玄)准(学)确。cin >> c_1;map[c_1][c_2 - 'A' + 1] = 1;}for(int i = 1; i <= n + 2; i++) map[0][i] = map[n + 1][i] = map[i][0] = map[i][n + 1] = 1; //初始化dfs(1, 1, 1, 0);  //向初始两个方向搜索dfs(1, 1, 3, 0);write(ans);  //输出答案 return 0;
}

【题目】[USACO5.2]蜗牛的旅行Snail Trails相关推荐

  1. 牛客网【每日一题】5月8日题目精讲 codeJan与旅行

    比赛链接: 文章目录 题目描述 题解: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 c ...

  2. 蓝桥杯stema考试题目讲解 0814CC02 蜗牛爬井 2021

    题目: 0814CC02 时间限制: 1000MS 内存限制: 65536KB 题目描述: 编程实现:蜗牛爬井 题目描述: 有一口N米深的井,蜗牛从井底向井口爬,白天向上爬3米,晚上向下滑1米,那么蜗 ...

  3. usaco snail trails(dfs)

    dfs啊,我还写了好长时间,一天不如一天. /* ID:jinbo wu TASK: snail LANG:C++ */ #include<bits/stdc++.h> using nam ...

  4. usaco Snail Trails

    N没有给数据范围是这题最恶心的地方,因为这个wa了有点恶心. /* ID: modengd1 PROG: snail LANG: C++ */ #include <iostream> #i ...

  5. C++题解:蜗牛旅行

            目录 题目 题解 题目 1000ms 524288K 蜗牛在制定今天的旅游计划,有 nn 个景点可选,它已经把这些景点按照顺路游览的顺序排成一排了,每个地方有相应的景观,这里用一个整数 ...

  6. B.一个人的旅行 (dijkstra算法)

    这题实在太醉了.十分简单的一道最短路径.我也wa了几次.最后发现可能是在循环次数n的设置上溢出了.s[1001]最大就1000...注意两点之间不止一个路径.上一题畅通工程就被坑惨了. 下面附题目 B ...

  7. HDOJ 2066 HDU 2066 一个人的旅行 ACM 2066 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目地址:          http://acm.hdu.edu.cn/showproblem.php?pid=2066 ...

  8. UOJ#198 [CTSC2016]时空旅行

    题目 UOJ#198 [CTSC2016]时空旅行 题解 QAQ允许我做一个悲伤的表情.这题题解真少.我要做一个造福人类的人. 首先呢可以看出,如果把每个时空当做一个节点,这是棵树,每个节点有一个添加 ...

  9. 蜗牛机器i211网卡驱动_5个很棒的蜗牛邮件驱动的艺术项目

    蜗牛机器i211网卡驱动 The Internet has made it possible for artists to spread their work to huge, world wide ...

  10. 蜗牛游戏将在美上市:收入下滑,研发费用下降,石海夫妇为大赢家

    近日,蜗牛游戏(NASDAQ:SNAL,Snail)在美国证券交易委员会披露招股书,准备在纳斯达克上市.目前,蜗牛游戏已经启动招股,申购价格区间为4.00美元/ADS至6.00美元/ADS. 本次上市 ...

最新文章

  1. 【转载】Python 深入浅出支持向量机(SVM)算法
  2. mysql实现树形_Mysql实现树形递归查询
  3. gulp版本号管理插件注意事项
  4. 什么是灰度发布?灰度发布方式 系统的割接 灰度部署典型的框架架构
  5. CI框架源码学习笔记7——Utf8.php
  6. linux fork脚本,shell调度脚本的三种不同方法(fork, exec, source)
  7. 简单记录一下做的项目过程中踩过的坑
  8. Mac 电脑下搭建DOSBox汇编环境
  9. scp拷贝服务器文件,scp 拷贝文件到远程服务器
  10. Hadoop运行原理总结
  11. ubuntu系统配置i3wm窗口管理器
  12. linux zip -e,在 Linux 上压缩文件:zip 命令的各种变体及用法
  13. 深处python漩涡中,谁能独善其身?
  14. 中国身份证号码验证,支持15 18位,可验证成功90 的身份证号
  15. 成功解决 TKK: 更新 TKK 失败,请检查网络连接 idea翻译错误
  16. 使用FSO把文本信息导入数据库
  17. 概率密度雅可比行列式
  18. geohash网格图_Geohash 网格聚合
  19. VMware新建OracleLinux6.5虚拟机
  20. R语言与多元线性回归分析计算实例

热门文章

  1. win10office2016计算机试题,大学计算机基础(Windows10+Office2016)试卷6(含答案).docx
  2. 2018-2019赛季多校联合新生训练赛第四场题解与补题(中石油)
  3. Unity3D 2D设计小游戏移动幻影的实现
  4. Visual studio 无法打开源文件的问题或系统找不到指定文件
  5. nero如何刻录光盘
  6. IPD解读——市场管理(MM)方法论
  7. python中执行py文件出错(提示File “stdin”,line 1,SyntaxError:invalid syntax)
  8. 嵌入式操作系统介绍之 NuttX
  9. 树莓派2B使用360随身WiFi2代连接WiFi
  10. (pattern),(?:pattern),(?=pattern)(?!pattern)不明白,让我豁然开朗的文章