返回题解分享
讨论 / 题解分享/ 帖子详情

传送阵(编程题) - 题解

#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 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!