LETTERS(DFS)

【题目描述】

给出一个row×colrow×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。

【输入】

第一行,输入字母矩阵行数RR和列数SS,1≤R,S≤201≤R,S≤20。

接着输出RR行SS列字母矩阵。

【输出】

最多能走过的不同字母的个数。

【输入样例】

复制代码
3 6
HFDFFB
AJHGDH
DGAGEH

【输出样例】

复制代码
6

原题链接:信息学奥赛一本通(C++版)在线评测系统

学习链接:《信息学奥赛一本通》搜索与回溯算法:1212LETTERS_哔哩哔哩_bilibili

【解题思路】

  1. 输入字母矩阵
  2. 从左上角作为第一步,开始对其上下左右四个方向开始搜索,若四个方向都已无法搜素或搜索完毕,则回溯
  3. 直到所有路径全部搜索完毕,找到最长的路径(不能出现相同字母)

代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int r,s;
char ch[25][25];//输入的字母矩阵 
int t[200];//桶,装入已访问的字母 
int x[4]={-1,1,0,0};//x方向的偏移量
int y[4]={0,0,-1,1};//y方向的偏移量
int maxx=0;//记录最长路径

void dfs(int nx,int ny,int len)
{
	maxx=max(maxx,len);//每到一个字母都比较一下路径 
	for(int i=0;i<4;i++)
	{
		//下一个出发搜索的字母坐标 
		int x1=nx+x[i];
		int y1=ny+y[i];
		
		//超出边界,跳过 
		if(x1<0 || x1>=r || y1<0 || y1>=s)
			continue;
		 
		//如果该位置的字母未装入过进桶t[],则可从该位置出发搜索 
		if(t[ch[x1][y1]-'A']==0)
		{
			t[ch[x1][y1]-'A']=1;//将该位置的字母装入桶里
			
			//步数要+1
			len++;
			
			//从该点出发继续向其四个符合条件的方向搜索
			dfs(x1,y1,len);
			
			//从该点出发的四个方向能到达的路径都已搜索完毕,回溯回来,并将搜索留下的痕迹清理干净
			//首先是路径要缩短回来
			len--;
			//再将该方向得的字母移出桶外,因为其他路径的搜索可能也会经过该字母
			t[ch[x1][y1]-'A']=0;
			
			//将继续从其他方向的字母出发搜索,即for的i++ 
			 
		} 
	}
}
 
int main()
{
	cin>>r>>s;
	for(int i=0;i<r;i++)
		for(int j=0;j<s;j++)
			cin>>ch[i][j]; 
	t[ch[0][0]-'A'] =1;  //注意要先将起点装入桶,避免它其他方向的字母跟他一样 
	dfs(0,0,1);//dfs(x,y,len);从(1,1)出发,步数len为1
	cout<<maxx<<endl;	
	return 0;
}

希望能帮助到各位同志,祝天天开心,学业进步!

相关推荐
Jay20021117 分钟前
【机器学习】33 强化学习 - 连续状态空间(DQN算法)
人工智能·算法·机器学习
panzer_maus16 分钟前
归并排序的简单介绍
java·数据结构·算法
獭.獭.17 分钟前
C++ -- STL【unordered_set和unordered_map的使用】
c++·stl·unordered_map·unordered_set
cici158741 小时前
二值化断裂裂缝的智能拼接算法
人工智能·算法·计算机视觉
麦格芬2301 小时前
LeetCode 763 划分字母区间
算法·leetcode·职场和发展
自不量力的A同学1 小时前
OpenNJet v3.3.1.3
笔记
star _chen1 小时前
C++ std::move()详解:从小白到高手
开发语言·c++
福尔摩斯张1 小时前
C++核心特性精讲:从C语言痛点出发,掌握现代C++编程精髓(超详细)
java·linux·c语言·数据结构·c++·驱动开发·算法
charlie1145141912 小时前
如何快速在 VS2026 上使用 C++ 模块 — 完整上手指南
开发语言·c++·笔记·学习·现代c++
涛涛北京2 小时前
【强化学习实验】- 策略梯度算法
人工智能·算法