#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;
string s; //存储已走过的字符
int maxA=1;
const int row = 3;
const int col = 6;
char a[4][7]={
{'A','A','A','A','A','A','A'},
{'A','H','F','D','F','F','B'},
{'A','A','J','H','G','D','H'},
{'A','D','G','A','G','E','H'},
};
void skip(int h,int w,int n){
bool flag = true;
if(h-1>=1 && s.find(a[h-1][w]) == string::npos){ //上移
flag = false; //还没走到最后1步
s+= a[h-1][w];
skip(h-1,w,n+1); //2.搜索
s.erase(s.end() - 1); //3.回溯
}
if(h+1<=row && s.find(a[h+1][w]) == string::npos){ //下移
flag = false; //还没走到最后1步
s+= a[h+1][w];
skip(h+1,w,n+1); //2.搜索
s.erase(s.end() - 1); //3.回溯
}
if(w-1>=1 && s.find(a[h][w-1]) == string::npos){ //左移
flag = false; //还没走到最后1步
s+= a[h][w-1];
skip(h,w-1,n+1); //2.搜索
s.erase(s.end() - 1); //3.回溯
}
if(w+1<=col && s.find(a[h][w+1]) == string::npos){ //右移
flag = false; //还没走到最后1步
s+= a[h][w+1];
skip(h,w+1,n+1); //2.搜索
s.erase(s.end() - 1); //3.回溯
}
if(flag) maxA = n > maxA ? n : maxA; //走到最后1步,比较大小
}
int main()
{
//流程图:分析 >> 敲码 -> !不要用战术上的勤奋掩盖战略上的懒惰!
s += a[1][1];
skip(1,1,1); //坐标从(1,1)开始且其实已经有1个
cout << maxA;
return 0;
}
//cout << "输入";
练习1 - LETTERS
最新推荐文章于 2021-04-04 10:53:37 发布