传送
问题描述:

1.
已知 (i)~(i+1) 可行 (1<=i<=n-1)
2.
给出 (i)~(n+1)的关系 (1<=i<=n)
a[i]=0:(i)~(n+1) 可行。
a[i] =1:(n+1)~(i) 可行 。
3.
遍历所有点一次。
输出路径。(不存在则输出-1)
思路分析:
考虑三种情况。
1.(n+1)~(1)~(2)~ ...~ (n)
满足条件 a[1]==1
2.(1)~(2)~ ...~(n)~(n+1)
满足条件 a[n]==0
3.(1)~(2)~...~(k)~(n+1)~(a[k+1])~...~(n)
满足条件 a[k]==0&&a[k+1]==1
解决方案:
/* 2021.8.16 */
#include <bits/stdc++.h>
#define bbn 200005
#define mod 1000000007 //1e9+7
typedef long long int LL;
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
bool judge=0;
int n;
int a[bbn]= {};
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
if(a[1]==1)
{
cout<<n+1<<' ';
for(int i=1; i<=n; i++)
{
cout<<i<<' ';
}
cout<<endl;
continue;
}
else if(a[n]==0)
{
for(int i=1; i<=n; i++)
{
cout<<i<<' ';
}
cout<<n+1<<' ';
cout<<endl;
continue;
}
else
{
for(int i=1; i<=n-1; i++)
{
if(a[i]==0&&a[i+1]==1)
{
for(int j=1; j<=i; j++)
{
cout<<j<<' ';
}
cout<<n+1<<' ';
for(int j=i+1; j<=n; j++)
{
cout<<j<<' ';
}
cout<<endl;
judge=1;
break;
}
}
}
if(judge==0)
cout<<-1<<endl;
}
}

本文介绍了如何根据给定的布尔数组a,判断从1到n+1的路径可行性,并在满足特定条件时输出路径,包括(i)~(n+1)、(1)~(n)~(n+1)和(i)~(k)~(n+1)~(a[k+1])~...~(n)的路径。使用C++代码实现并处理三种可能的情况。
369

被折叠的 条评论
为什么被折叠?



