题目描述
一种单人玩的游戏,规则为:
在一个R行C列的方格上,每个方格中有一个A-Z的字母。游戏从左上角(第一行,第一列)位置开始,一步一步地向相邻(上、下、左、右)方格移动。唯一的限制是路径上的方格中的字母,每种字母只能出现1次。
游戏的目标是走尽可能长的路径。请你写程序算出指定棋盘上,可能走的最长步数。
输入输出格式
输入格式:
第一行有两个以空格分开的两个整数R和C,1≤R,C≤20。
后面R行每行有C个字母,每行表示棋盘上的一行状态。
输出格式:
有且只有一行,你计算出的最长步数。
输入输出样例
输入样例一:
2 4 CAAB ADCB
输出样例一:
3
输入样例二:
3 6 HFDFFB AJHGDH DGAGEH
输出样例二:
6
输入样例三:
5 5 IEFCJ FHFKC FFALF HFGCF HMCHH
输出样例三:
View Code
10
思路:一步一步往下搜,记得回溯步数。
#include<iostream> #include<string> using namespace std; int n,m,t,ans; char a[21][21]; bool g[27]; void dfs(int w,int x) { if(w-1>0&&!g[a[w-1][x]-64]){g[a[w-1][x]-64]=1;t++;dfs(w-1,x);t--;g[a[w-1][x]-64]=0;} if(x-1>0&&!g[a[w][x-1]-64]){g[a[w][x-1]-64]=1;t++;dfs(w,x-1);t--;g[a[w][x-1]-64]=0;} if(w+1<=n&&!g[a[w+1][x]-64]){g[a[w+1][x]-64]=1;t++;dfs(w+1,x);t--;g[a[w+1][x]-64]=0;} if(x+1<=m&&!g[a[w][x+1]-64]){g[a[w][x+1]-64]=1;t++;dfs(w,x+1);t--;g[a[w][x+1]-64]=0;} ans=max(ans,t); return; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)cin>>a[i][j]; g[a[1][1]-64]=1; dfs(1,1); cout<<ans+1; return 0; }