1212:LETTERS


时间限制: 1000 ms         内存限制: 65536 KB

【题目描述】

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

【输入】

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

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

【输出】

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

【输入样例】

3 6
HFDFFB
AJHGDH
DGAGEH

【输出样例】

6

解析:搜索,详见代码:

#include<bits/stdc++.h>
using namespace std;
int r, s;
char a[25][25];//字母矩阵
bool b[26];//字母是否经过
int ans = 0;
int dx[4] = {0, 0, 1, -1}; //四个方向
int dy[4] = {1, -1, 0, 0};
//从x,y出发,已经经过sum个字母
void dfs(int x, int y, int sum) {
    ans = max(ans, sum); //取最大值
    for(int i = 0; i < 4; i++) { //四个方向
        int xx = x + dx[i];
        int yy = y + dy[i];
        //没出界,且目的地字母没有经过
        if (xx >= 1 && xx <= r && yy >= 1 && yy <= s && b[a[xx][yy] - 'A'] == 0) {
            b[a[xx][yy] - 'A'] = 1;//标记已经过
            dfs(xx, yy, sum + 1);//继续搜索
            b[a[xx][yy] - 'A'] = 0;//去除标记,回溯
        }
    }
}
int main() {
    cin >> r >> s;
    for(int i = 1; i <= r; i++) {
        for(int j = 1; j <= s; j++) {
            cin >> a[i][j];
        }
    }
    b[a[1][1] - 'A'] = 1; //标记出发点字母已经经过
    dfs(1, 1, 1); //从1,1出发,经过一个字母
    cout << ans;
    return 0;
}

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐