题目出处:《信息学奥赛一本通》第五章上机练习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 题解的更多相关文章

  1. python入门练习题1

    常见python入门练习题 1.执行python脚本的两种方法 第一种:给python脚本一个可执行的权限,进入到当前存放python程序的目录,给一个x可执行权限,如:有一个homework.py文 ...

  2. POJ 1579 Function Run Fun 【记忆化搜索入门】

    题目传送门:http://poj.org/problem?id=1579 Function Run Fun Time Limit: 1000MS   Memory Limit: 10000K Tota ...

  3. Lucene建立索引搜索入门实例

                                第一部分:Lucene建立索引 Lucene建立索引主要有以下两步:第一步:建立索引器第二步:添加索引文件准备在f盘建立lucene文件夹,然后 ...

  4. 排序入门练习题3 谁考了第k名 题解

    题目出处:<信息学奥赛一本通>第二章 上机练习1 题目描述 在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名的学生的学号和成绩. 输入格式 输入的第一行包含两 ...

  5. 搜索入门之dfs--经典的迷宫问题解析

    今天来谈一下dfs的入门,以前看到的dfs入门,那真的是入门吗,都是把dfs的实现步骤往那一贴,看完是知道dfs的步骤了,但是对于代码实现还是没有概念.今天准备写点自己的心得,真的是字面意思--入门. ...

  6. N皇后//搜索入门

    P1080 N皇后 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列只有一个,每条 ...

  7. 35.app后端搜索入门

    现在人们的网络生活已经离不开搜索了,遇到不懂的问题,想知道的事情,搜索一下,就知道答案. 在app中,最常见的搜索情景就是搜索用户.只有几百,几千的用户量时,可以直接用用like这样的模糊查询,但是, ...

  8. 搜索入门_简单搜索bfs dfs大杂烩

    dfs题大杂烩 棋盘问题  POJ - 1321 和经典的八皇后问题一样.  给你一个棋盘,只有#区域可以放棋子,同时同一行和同一列只能有一个棋子. 问你放k个棋子有多少种方案. 很明显,这是搜索题. ...

  9. poj1088(记忆化搜索入门题)

    题目链接:http://poj.org/problem?id=1088 思路: 明显的记忆化搜索题,用dp[i][j]表示从(i,j)出发能滑的最远距离,用dfs搜索,若dp[x][y]>0即已 ...

随机推荐

  1. ASP.NET Core MVC 之过滤器(Filter)

    ASP.NET MVC 中的过滤器允许在执行管道中的特定阶段之前或之后运行代码.可以对全局,也可以对每个控制器或每个操作配置过滤器. 1.过滤器如何工作 不同的过滤器类型在管道中的不同阶段执行,因此具 ...

  2. Java虚拟机详解(五)------JVM参数(持续更新)

    JVM参数有很多,其实我们直接使用默认的JVM参数,不去修改都可以满足大多数情况.但是如果你想在有限的硬件资源下,部署的系统达到最大的运行效率,那么进行相关的JVM参数设置是必不可少的.下面我们就来对 ...

  3. PL/SQL 调用 JAVA代码

    1.直接在 SQL Developer中写入代码 create or replace and compile java source named "HelloWorld" as p ...

  4. J.U.C并发包(1)

    J.U.C并发包(1) AbstractQueuedSynchronizer AbstractQueuedSynchronizer是JUC并发包中锁的底层支持,AbstractQueuedSynchr ...

  5. 玩转VSCode插件之Remote-SSH

    前言 每当更换电脑就要从新搭建一遍开发环境... 每当拉完最新代码程序在本地跑不起来的时候就要检查服务器和开发电脑的环境... 每当服务器上出Bug的时候就想如果可以能够调试服务器代码多好啊.. 你是 ...

  6. SpringBoot进阶教程(六十一)intellij idea project下建多个module搭建架构(下)

    在上一篇文章<SpringBoot进阶教程(六十)intellij idea project下建多个module(上)>中,我们已经介绍了在intellij idea中创建project之 ...

  7. SQL奇技淫巧(01):给查出的数据排序编个号【row_number() over(order by c)】(mysql,db2,oracle,sqlserver通用)

    我们天天都在跟数据库打交道,写下的代码不计其数,写下的SQL更是可以绕地球几圈.这里收集关于SQL的神奇语法及用法,虽然你可能没有用过,但这些SQL却可以在关键的时候,派上用场. 我对SQL语句的理解 ...

  8. Liunx软件安装之Zabbix监控软件

    Zabbix 是什么 zabbix(音同 za:bix)是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix 能监视各种网络参数,保证服务器系统的安全运营 ...

  9. 配置springboot项目使用外部tomcat

    配置springboot项目使用外部tomcat 1.在pom文件中添加依赖 <!--使用自带的tomcat--> <dependency> <groupId>or ...

  10. HTML5学习手册

    目录 HTML 简介 HTML 简介 什么是 HTML? HTML 标签 HTML 文档 = 网页 基本的 HTML 标签 - 四个实例 HTML 标题 HTML 段落 HTML 链接 HTML 图像 ...