#include<iostream>
#include<vector>
using namespace std;
int flag = true;
int all = false;
int flag1 = false;
int ans = 0;
void dfs(vector<int>& a, vector<int>& vis, int pos, int pre, int Temp)//pos代表在第几个传送阵
{
if (ans < Temp)ans = Temp;
if (Temp == a.size() - 1)return;//深度为传送阵数量,则返回
if (!vis[pos])
{
vis[pos] = true;
dfs(a, vis, a[pos], pos, Temp + 1);//pos未走过,将vis设置为走过
}
//走到此则说明开始循环
//试探破局之法
if (!flag)return;//没有魔法,破不了;
if (pos == 1 && !vis[2]) flag = false, dfs(a, vis, 2, pre, Temp), vis[2] = false, flag = true;//第二个点没走过,则走一下
if (pos > 1 && pos < a.size() && !vis[pos - 1]) flag = false, dfs(a, vis, pos - 1, pre, Temp), vis[pos - 1] = false, flag = true;
if (pos > 1 && pos < a.size() - 1 && !vis[pos + 1])flag = false, dfs(a, vis, pos + 1, pre, Temp), vis[pos + 1] = false, flag = true;
if (pos == pre)//走到试探末端了,回去
{
flag1 = true;
return;
}
if (flag1)return;
dfs(a, vis, a[pos], pre, Temp);//继续试探下一个
}
int main()
{
int n; cin >> n;
vector<int> a(n + 1);//传送阵,从第一个开始,0无
vector<int> vis;//是否走过该传送阵
vis.resize(n + 1, 0);
int Temp = 0;
for (int i = 1; i <= n; i++)cin >> a[i];//输入传送阵能传送到第几传送阵
for (int i = 1; i <= n; i++)//试探每一个初始点
{
dfs(a, vis, i, 0, Temp);
}
cout << ans;
return 0;
}
0 回复
0 转发
0 喜欢
6 阅读



