题目描述
给出一个 roe×col 的大写字母矩阵,一开始的位置为左上角,
你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。
问最多可以经过几个字母。
输入格式
第一行,输入字母矩阵行数 R 和列数 S;
接着输出 R 行 S 列字母矩阵。
输出格式
最多能走过的不同字母的个数。
输入样例
3 6
HFDFFB
AJHGDH
DGAGEH
输出样例
6
数据范围
1 ≤ R, S ≤ 20
题解
DFS:
#include <iostream>
using namespace std;
const int N = 30, M = 100;
char g[N][N];
int n, m, ans = 1;
bool vis[N][N], Hash[M];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
void dfs(int x, int y, int len)
{
ans = max(ans, len);
for (int i = 0; i < 4; i ++)
{
int a = x + dx[i], b = y + dy[i];
if(a < 1 || a > n || b < 1 || b > m) continue;
if(vis[a][b] || Hash[g[a][b]]) continue;
Hash[g[a][b]] = true;
vis[a][b] = true;
dfs(a, b, len + 1);
vis[a][b] = false;
Hash[g[a][b]] = false;
}
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++) cin >> g[i] + 1;
vis[1][1] = true;
Hash[g[1][1]] = true;
dfs(1, 1, 1);
cout << ans << endl;
return 0;
}