题目描述
一种单人玩的游戏,规则为:
在一个R行C列的方格上,每个方格中有一个A~Z的字母。游戏从左上角(第一行,第一列)位置开始,一步一步地向相邻(上、下、左、右)方格移动。唯一的限制是路径上的方格中的字母,每种字母只能出现1次。
游戏的目标是走尽可能长的路径。请你写程序算出指定棋盘上,可能走的最长步数。
输入
第1行两个整数R和C(1≤R,C≤20);
后面R行每行有C个字母,每行表示棋盘上的一行状态。
输出
有且只有一行,你计算出的最长步数。
样例输入
5 5 IEFCJ FHFKC FFALF HFGCF HMCHH
样例输出
10
经典搜索
重点:标记
为甚我阅读那么高但一个赞也没有~
#include <bits/stdc++.h>
using namespace std;
int n, m, walk[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}, bz[26], sum, ans;
char a[1000][25];
void dfs(int x, int y)
{
int xx, yy;
for (int i = 0; i < 4; i++)
{
xx = x + walk[i][0];
yy = y + walk[i][1];
if (sum > ans)
ans = sum;
if (bz[a[xx][yy] - 'A'] == 0 && xx >= 0 && xx < n && yy >= 0 && yy < m)
{
bz[a[xx][yy] - 'A'] = 1;
sum++;
dfs(xx, yy);
bz[a[xx][yy] - 'A'] = 0;
sum--;
}
}
}
main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
scanf("%s", a[i]);
}
bz[a[0][0] - 'A'] = 1;
dfs(0, 0);
cout << ans + 1;
return 0;
}