【题目描述】
给出一个roe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。
【输入】
第一行,输入字母矩阵行数R和列数S,1≤R,S≤20。
接着输出R行S列字母矩阵。
【输出】
最多能走过的不同字母的个数。
【输入样例】
3 6
HFDFFB
AJHGDH
DGAGEH
【输出样例】
6
本题因为只能走上下左右方向,而且不能走曾经走过的字母,所以会有很多的路线,需要不断地更新走的长度。
#include<bits/stdc++.h>
using namespace std;
string s[22];
int r, c, ans = 1, dir[4][2] = {{1, 0}, {0, 1}, {-1, 0},{0, -1}};
int a[26];
bool in(int x, int y){
return x >= 0 && x < r && y >= 0 && y < c;
}
void dfs(int x, int y, int cnt){//x:表示行 y:列 cnt:到当前行列(x,y)所统计的字母数
if(cnt > ans){
ans = cnt;
}
for(int i=0; i<4; i++){
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if(in(tx, ty) && !a[s[tx][ty] - 'A']){
a[s[tx][ty] - 'A'] = 1;
dfs(tx, ty, cnt+1);
a[s[tx][ty] - 'A'] = 0;
}
}
}
int main(){
cin >> r >> c;
for(int i=0; i<r; i++)
cin >> s[i];
a[s[0][0] - 'A'] = 1;
dfs(0, 0, 1);
cout << ans;
return 0;
}