搜索入门练习题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即已 ...
 
随机推荐
- Spark 系列(十)—— Spark SQL 外部数据源
			
一.简介 1.1 多数据源支持 Spark 支持以下六个核心数据源,同时 Spark 社区还提供了多达上百种数据源的读取方式,能够满足绝大部分使用场景. CSV JSON Parquet ORC JD ...
 - 大数据学习之旅2——从零开始搭hadoop完全分布式集群
			
前言 本文从零开始搭hadoop完全分布式集群,大概花费了一天的时间边搭边写博客,一步一步完成完成集群配置,所以相信大家按照本文一步一步来完全可以搭建成功.需要注意的是本文限于篇幅和时间的限制,也是为 ...
 - Spring 2017 Assignments2
			
一.作业要求 原版:http://cs231n.github.io/assignments2017/assignment2/ 翻译:http://www.mooc.ai/course/268/lear ...
 - 前端中的设计模式 JavaScript
			
最近再准备秋招,然后顺便把过去空白的设计模式相关概念补一补,这些内容都是从<JavaScript设计模式与开发实践>一书中整理出来的 (1)单例模式 定义:保证一个类仅有一个实例,并提供一 ...
 - 《C# 7.0核心技术指南》到货
			
前几天有大佬推荐本书,并且折扣相当的划算,随入手一本.
 - 关于事务,事务的特性,spring事务的传播特性
			
1.什么是事务: 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败). 2.事务特性: 事务特性分为四个:原子性(At ...
 - HBase的安装和使用
			
文章作者:foochane 原文链接:https://foochane.cn/article/2019062801.html 1 Hbase基本介绍 Hbase是一个分布式数据库,可以提供数据的实时 ...
 - 翻牌动画(CocosCreator)
			
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 在游戏中,有时候为了通过一种有意思的途径,让用户在一些物品中随机获取某种物品,除了前面我们提到的使用大转盘抽奖获得, ...
 - C#Socket_TCP(客户端,服务器端通信)
			
客户端与服务器通信,通过IP(识别主机)+端口号(识别应用程序). IP地址查询方式:Windows+R键,输入cmd,输入ipconfig. 端口号:可自行设定,但通常为4位. 服务器端: usin ...
 - Nginx入门(二):镜像和容器
			
0.docker常用命令 #镜像名 版本标签 镜像id 创建时间 镜像大小 REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest fce289 ...