描述
给出一个roe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。
格式
输入格式
第一行,输入字母矩阵行数R和列数S,1≤R,S≤20。 接着输出R行S列字母矩阵。
输出格式
最多能走过的不同字母的个数。
样例
输入样例
3 6 HFDFFB AJHGDH DGAGEH
输出样例
6
限制
时间限制: 1000 ms
内存限制: 65536 KB
现在做的几个回溯题目感觉有点模板形式,套路很简单,找到递归的三要素,递归结束后进行回溯处理。
递归的三要素:递归出口、函数处理过程、递归参数。说明一下这里的递归出口是
a[c[tmpx][tmpy]] == 1的情况。
对回溯有疑惑的,可以看看该博主的博文:LeetCode--回溯法心得
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
int a[92];
int r, s, ans=0;
char c[22][22];
void dfs(int, int, int);
int main()
{
memset(a, 0, sizeof(a));
int sum=1;
scanf ("%d %d\n", &r, &s);
for (int i=0; i<r; i++) {
for (int j=0; j<s; j++) {
scanf ("%c", &c[i][j]);
}
getchar();
}
int x = 0;
int y = 0;
a[c[x][y]] = 1;
dfs(x, y, sum);
printf ("%d\n", ans);
return 0;
}
void dfs(int x, int y, int sum) {
if (sum > ans) {
ans = sum;
}
for (int i=0; i<4; i++) { //递归函数的处理过程
int tmpx = x + dx[i];
int tmpy = y + dy[i];
if (a[c[tmpx][tmpy]] == 0 && tmpx >= 0 && tmpx < r && tmpy >= 0 && tmpy < s) { //递归出口判断
x += dx[i];
y += dy[i];
a[c[x][y]] = 1; //开始经过一个字母
dfs(x, y, ++sum); //别用sum++;
a[c[x][y]] = 0; //以下为回溯
x -= dx[i];
y -= dy[i];
sum--;
}
}
}