LETTERS------dfs

题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1212

【题目描述】

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

【输入】

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

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

【输出】

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

【输入样例】

3 6
HFDFFB
AJHGDH
DGAGEH

【输出样例】

6

解题思路:

1.我一开始的思路就正常的深搜,用一个字符串存不重复的字符。每走一步去判断读进去的字符是否重复,虽然比较繁琐,但是最后也实现了,去网上搜了果然我这个思路不是最简单的

2.可以定义一个一维数组,1-26对应26个英文字母,如果某个字母走过,那就把数组对应的下标标记一下,每走一步只需要判断对应下标就可以,大佬果然是大佬

下面附上两个方法的代码,可以着重看后一种方法

代码一:

#include
using namespace std;
int r,c,maxn;
char a[25][25];
int book[25][25];
int nex[4][2]={0,1,1,0,0,-1,-1,0};
void dfs(int x,int y,int step,string s)
{
	if(step>maxn)
		maxn=step;
	for(int i=0;i<4;i++)
	{
		int tx=x+nex[i][0];
		int ty=y+nex[i][1];
		if(tx<1||tx>r||ty<1||ty>c||book[tx][ty]==1)
			continue;
		int j;
		for(j=0;j>r>>c;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			cin>>a[i][j];
	book[1][1]=1;
	string s;
	s+=a[1][1];
	dfs(1,1,1,s);
	cout<

代码二:

#include
using namespace std;
int r,c,maxn;
char a[25][25];
int book[25][25];
int num[30];
int nex[4][2]={0,1,1,0,0,-1,-1,0};
void dfs(int x,int y,int step)
{
	if(step>maxn)
		maxn=step;
	for(int i=0;i<4;i++)
	{
		int tx=x+nex[i][0];
		int ty=y+nex[i][1];
		if(tx<1||tx>r||ty<1||ty>c||book[tx][ty]==1)
			continue;
		if(num[a[tx][ty]-'A']==0)
		{
			book[tx][ty]=1;
			num[a[tx][ty]-'A']=1;
			dfs(tx,ty,step+1);
			num[a[tx][ty]-'A']=0;
			book[tx][ty]=0;
		}
	}
}
int main()
{
	cin>>r>>c;
	for(int i=1;i<=r;i++)
		for(int j=1;j<=c;j++)
			cin>>a[i][j];
	num[a[1][1]-'A']=1;
	book[1][1]=1;
	dfs(1,1,1);//横坐标、纵坐标、步数 
	cout<

 

你可能感兴趣的:(dfs)