ybt1212 LETTERS

ybt1212 LETTERS

【题目描述】

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

【输入】

第一行,输入字母矩阵行数R和列数S,1≤R,S≤20。

接着输出R行S列字母矩阵。

【输出】

最多能走过的不同字母的个数。

【输入样例】

3 6
HFDFFB
AJHGDH
DGAGEH

【输出样例】

6

【题解】

从0,0开始搜索,维护一个数组lt,存储当前路径中出现的字母。

之前出现的字母如果遍历到,就返回。

记录这个点出发到四个方向所能经过的最大字母的最大值,加上1(它本身的字母)返回给上级,这样就能找出最大值。

注意:

这道题求的是DFS数里,最大的根叶路径长度而不是整个DFS序中出现的所有字母。(血的教训)

#include<iostream>
#include<cstring>
using namespace std;
int xr[4] = { 0,1,0,-1 };
int yr[4] = { -1,0,1,0 };//操作记录
int T, n, m, ans = 0, a[100][100];
char ch;
bool lt[30];
int dfs(int x, int y) {//深搜
    //cout << x << " " << y << "    ";
    if ((x < 0) || (y < 0)) {
        return 0;
    }
    if ((x >= n) || (y >= m)) {
        return 0;
    }
    if (lt[a[x][y]]) {
        return 0;
    }
    int t=0;
    lt[a[x][y]] = 1;
    for (int i = 0; i < 4; i++) {
        ans = dfs(x + xr[i], y + yr[i]);
        if (t < ans) {
            t = ans;
        }
    }
    lt[a[x][y]] = 0;
    return t+1;
}
int main() {
    cin >> n >> m;//输入矩阵大小
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> ch;
            a[i][j] = ch - 'A';
        }
    }
    ans = dfs(0, 0);//从0,0的位置开始搜
    cout << ans << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Wild-Donkey/p/12313406.html
今日推荐