1212:LETTERS

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

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

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

【输出】
最多能走过的不同字母的个数。

【输入样例】
3 6
HFDFFB
AJHGDH
DGAGEH
【输出样例】
6
对于这种题都是有模板的,一定记住!
通过题目,你需要知道几个需要解决的问题
一:不能让路线超出范围
二:不能有重复的元素被经过,这就需要,当你经过一个字母后把它定义成别的东西,把这个表内的所有这类字母都改成这个东西
三:不能走 走过的路,所以经过之后也得把这个点定义成别的东西
四:规定可以上下左右走,所以把它能走的方向定义出来!

五:不要纠结结束的标志是什么 管他的

代码如下

依据上述说的怎么做到第二点呢?有一个技巧。以为既然是字母 他们的值是有范围的,所以 定义一个数组例如int b[256];
假设你输入的字母为A,而我经过它之后,我用b[A]=1;即经过的我赋个1,这样只要是A都是1了

#include
#include
using namespace std;
int r, s,t1=0,t2;//记录 路线数的
char c[21][21]; //这个是用来输入表格的;
int a[21][21] = {0}, b[256];//a是用来表示我走到了那个点走过的都设成1,b是完成字母不重复的;
int x[4] = { 1,0,-1,0 };
int y[4] = { 0,1,0,-1 };//这俩很重要 ,一般的表格移动都需要这个,具体不是很明白为啥有0;
void  search(int x1,int y1,int t2)
{
	
	if (t1 < t2)
		t1 = t2;
	for (int j = 0; j <= 3; j++)
	{
		int nx = x[j] + x1;
		int ny = y[j] + y1;
		if (!b[c[nx][ny]] && nx >= 1 && nx <= r && ny <= s && ny >= 1&&a[nx][ny]!=1)
		{
			b[c[nx][ny]] = 1;
			a[nx][ny] = 1;
			search(nx, ny, t2 + 1);
			b[c[nx][ny]] = 0;//回溯。这个地方是重点 因为这个可以走 走过的路线,所以再赋回去!!!!
			a[nx][ny] = 0;
		}
	}
	
}

int main()
{
	cin >> r >> s;
	for (int i = 1; i <=r; i++)
		for (int j = 1; j <= s; j++)
			cin >> c[i][j];
	b[c[1][1]] = 1;
	search(1, 1,1);
	cout << t1;	
}

你可能感兴趣的:(1212:LETTERS)