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<iostream>
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<s.length();j++)
		{
			if(a[tx][ty]==s[j])
				break;
		}
		if(j==s.length())
		{
			book[tx][ty]=1;
			dfs(tx,ty,step+1,s+a[tx][ty]);
			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];
	book[1][1]=1;
	string s;
	s+=a[1][1];
	dfs(1,1,1,s);
	cout<<maxn<<endl;
	return 0;
}

代码二:

#include<iostream>
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<<maxn<<endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值