一、题目大意
一个方形棋盘,每个位置一个字母,一个人从左上角位置出发,每次往上、下、左、右
四个方向移动,不能经过同一个字母两次,问最多能走几步。
二、题目分析
首先,我们需要有一个标记visited[i]
表示那一个字母已经访问过了。然后要求最长路径,途中涉及到全局visited[i]
的恢复过程,因此只能用深搜。
递归出口:当无路可走时,计算当前步数,并更新答案。
三、代码
#include<iostream>
#include<cstring>
using namespace std;
const int MAX = 26;
char grad[MAX][MAX];
int vised[26];
int ans, R, S;
int dirs[4][2] = {{1,0},{-1,0},{0,-1},{0,1}};
void dfs(int x, int y, int cnt)
{
vised[grad[x][y] - 'A'] = 1;
int flag = 0;
for(int i=0; i<4; i++)
{
int nx = x + dirs[i][0];
int ny = y + dirs[i][1];
if(nx < 0 || nx >= R || ny < 0 || ny >=S)
continue;
if(vised[grad[nx][ny] - 'A'])
continue;
flag = 1;
dfs(nx, ny, cnt+1);
}
if(!flag)
ans = max(ans, cnt);
vised[grad[x][y] - 'A'] = 0;
}
int main()
{
cin >> R >> S;
for(int i=0; i<R; i++)
for(int j=0; j<S; j++)
cin >> grad[i][j];
ans = 0;
dfs(0, 0, 0);
cout << ans+1 << endl;
}