搜索入门练习题9 LETTERS 题解
题目出处:《信息学奥赛一本通》第五章上机练习1 或者 POJ1154
题目描述
给出一个 \(R\times S\) 的大写字母矩阵,一开始你所处的位置在左上角,你可以向上下左右四个方向移动,并且不能移到曾经经过的字母(比如,你之前走到过一个'A'上,那么你以后就不能再走到'A'上了)。问最多可以经过几个字母。
输入格式
第一行,输入字母矩阵行数 \(R\) 和列数 \(S\) , \(1 \le R,S \le 20\) 。
接着输入 \(R\) 行,每行为一个包含 \(S\) 个字母的字符串。用于表示 \(R \times S\) 的字母矩阵。
输出格式
输出一个数字,用于表示最多能走过的不同的字母的个数。
样例输入
3 6
HFDFFB
AJHGDH
DGAGEH
样例输出
6
题目分析
我们设行数为 \(R\) ,列数为 \(S\) ,用于保存字符的二维数组为 ch[][] 。
我们开一个布尔数组 bool vis[26],其中 vis[0] 用于表示字母 'A' 是否走到过,vis[1] 用于表示字母 'B' 是否走到过,……, vis[25] 用于表示字母 'Z' 是否走到过。
同时我们开一个搜索函数 dfs(int x, int y, int step) ,用于表示 “我当前在二维数组中的第 \(x\) 行第 \(y\) 列,并且我已经走了 \(step\) 步了” 这样一个状态。然后我遍历 \((x,y)\) 的上下左右4个点 \((xx,yy)\) ,如果 \((xx,yy)\) 能走到并且 ch[xx][yy] 上的那个字符我之前没有走到过,那么我可以递归的执行 dfs(xx, yy, step+1) 。
对于 step ,如果 step 比我当前记录的最大步数要大,则更新最大步数为 step(在下面的程序中我是用 ans 来表示最大步数的)。实现代码如下:
#include <bits/stdc++.h>
using namespace std;
int R, S, ans; // R,S分别表示行数和列数,ans表示最多经过字母数
int dir[4][2] = { -1, 0, 1, 0, 0, -1, 0, 1 }; // dir数组用于表示上下左右4个方向
char ch[22][22]; // ch数组用于表示我们的二位地图
bool vis[26]; // vis数组用于记录26个字母是否有走过,其中'A'对应vis[0],'B'对应vis[1],…
// in_map函数用于判断第x行第y列的元素是否超过地图边界
bool in_map(int x, int y) {
return x >= 0 && x < R && y >= 0 && y < S;
}
// dfs函数用于搜索,它表示当前在第x行第y列,已经走了step步
void dfs(int x, int y, int step) {
vis[ ch[x][y] - 'A' ] = true; // 首先将当且(x,y)这个点对应的字母的vis值标记为true
if (step > ans) ans = step; // 如果step比ans大,更新ans为step
for (int i = 0; i < 4; i ++) { // 遍历四个方向
int xx = x + dir[i][0];
int yy = y + dir[i][1]; // (xx,yy)就是新探索到的点
if (in_map(xx, yy) && !vis[ ch[xx][yy] - 'A' ]) { // 如果可以走,尝试性地走
dfs(xx, yy, step+1);
}
}
vis[ ch[x][y] - 'A' ] = false; // 因为搜索是尝试放,所以推出本次搜索记得将vis值标记回false
}
int main() {
cin >> R >> S;
for (int i = 0; i < R; i ++) cin >> ch[i];
dfs(0, 0, 1);
cout << ans << endl;
return 0;
}
搜索入门练习题9 LETTERS 题解的更多相关文章
- python入门练习题1
常见python入门练习题 1.执行python脚本的两种方法 第一种:给python脚本一个可执行的权限,进入到当前存放python程序的目录,给一个x可执行权限,如:有一个homework.py文 ...
- POJ 1579 Function Run Fun 【记忆化搜索入门】
题目传送门:http://poj.org/problem?id=1579 Function Run Fun Time Limit: 1000MS Memory Limit: 10000K Tota ...
- Lucene建立索引搜索入门实例
第一部分:Lucene建立索引 Lucene建立索引主要有以下两步:第一步:建立索引器第二步:添加索引文件准备在f盘建立lucene文件夹,然后 ...
- 排序入门练习题3 谁考了第k名 题解
题目出处:<信息学奥赛一本通>第二章 上机练习1 题目描述 在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名的学生的学号和成绩. 输入格式 输入的第一行包含两 ...
- 搜索入门之dfs--经典的迷宫问题解析
今天来谈一下dfs的入门,以前看到的dfs入门,那真的是入门吗,都是把dfs的实现步骤往那一贴,看完是知道dfs的步骤了,但是对于代码实现还是没有概念.今天准备写点自己的心得,真的是字面意思--入门. ...
- N皇后//搜索入门
P1080 N皇后 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列只有一个,每条 ...
- 35.app后端搜索入门
现在人们的网络生活已经离不开搜索了,遇到不懂的问题,想知道的事情,搜索一下,就知道答案. 在app中,最常见的搜索情景就是搜索用户.只有几百,几千的用户量时,可以直接用用like这样的模糊查询,但是, ...
- 搜索入门_简单搜索bfs dfs大杂烩
dfs题大杂烩 棋盘问题 POJ - 1321 和经典的八皇后问题一样. 给你一个棋盘,只有#区域可以放棋子,同时同一行和同一列只能有一个棋子. 问你放k个棋子有多少种方案. 很明显,这是搜索题. ...
- poj1088(记忆化搜索入门题)
题目链接:http://poj.org/problem?id=1088 思路: 明显的记忆化搜索题,用dp[i][j]表示从(i,j)出发能滑的最远距离,用dfs搜索,若dp[x][y]>0即已 ...
随机推荐
- 笑谈CSS的伪元素
今晚上我们来简单的聊一聊CSS的伪元素,多说无益,开聊 GG: 话说盘古开天辟地之时. QQ:嗨,咱今天还能讲的完吗?您给来点实际的啊. GG:要听实际的是吧,得嘞,那今天咱就来聊一聊CSS里的伪元素 ...
- 安装Windows Server 2008
下面介绍一下,Windows Server操作系统安装,以及在企业中的应用,在小型企业中可以使用不同的版本搭建不同类型的服务,小型企业中可以搭建Web服务,FTP服务,以及DNS和DHCP服务等,在大 ...
- threejs 学习之
主要内容: 使用 threejs 创建 20x20 的网格,鼠标移动时,方块跟随移动,点击时在网格任意位置放置方块,按 shift 时,删除当前位置方块. 流程如下: 创建网格 创建一个与网格同样尺寸 ...
- Java描述表达式求值的两种解法:双栈结构和二叉树
Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...
- Vue入门到TodoList练手
学习资料 慕课网 - vue2.5入门 基础语法 示例代码1 <div id="root"> <h1>hello {{msg}}</h1> &l ...
- CentOS 7 下 JDK1.8+Maven+Nginx+MySql+Git+Redis环境安装
CentOS 7 下 JDK1.8+Maven+Nginx+MySql+Git+Redis环境安装 安装目录准备 新建data目录,用来放下载的软件 mkdir -p /data 切换到该data目录 ...
- 在.net core web项目中生成图片验证码
第1步:添加SkiaSharp包引用 Install-Package SkiaSharp 第2步:编写生成图片验证码的代码 using SkiaSharp; //在类文件头部添加引用 public I ...
- 【Jmeter】- 使用 jmeter 进行 dubbo 接口测试
大家都知道 dubbo 是一个优秀 rpc 框架,它一般(dubbox 除外)通过对外提供 tcp协议的接口进行外部调用.而我们日常使用的测试工具 jmeter 并不支持 dubbo 协议的请求.所以 ...
- 关于AndroidStudio在真机安装的apk闪退(无法打开)的解决方案
问题描述: 重新安装AndroidStudio之后 1.发现在真机上安装apk时显示的是应用包名. 2.在真机上安装的apk无法打开,一直闪退. 如图: 解决方案: 关闭AndroidStudio的I ...
- java虚拟机10.内存模型与线程
多任务处理在现代计算机操作系统中是一项必备的功能,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,更重要的原因是计算机的运算速度与它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘 ...