【题目描述】
给出一个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<iostream>
#include<cstdio>
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;
}