首先,我们需要理解给定的规律:aai=n−i+1。这个规律告诉我们,排列中的每个元素都等于其索引在排列中的位置到排列长度的差值加一。
通过举例我们发现,两个元素无法构建一个合法解,也就是n不能只能被2整除,比如n=2,6,...都是无解的,可以手玩一下举几个例子
我们发现,四个元素,可以相互拆解,构成一个合法方案,例如n=4,可以构建合法解[2,4,1,3],如果n=5,也可以把5放在中间位置,构成合法解[2,4,5,1,3]
因此,根据上述推导过程,可以得出n=4korn=4k+1的时候是有解的,按照上述方式构造合法方案即可。
C++
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n;
cin >> n;
vector<int> a(n + 1);
if (n % 4 != 0 && n % 4 != 1) {
cout << -1 << endl;
return;
}
for (int i = 1; i <= n / 2; i += 2) {
a[i] = i + 1;
a[i + 1] = n - i + 1;
a[n - i + 1] = n - i;
a[n - i] = i;
}
if (n % 2 == 1)
a[n / 2 + 1] = n / 2 + 1;
for (int i = 1; i <= n; i++)
cout << a[i] << " ";
}
int main() {
solve();
return 0;
}
Java
import java.util.*;
public class Main {
public static void solve() {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] a = new int[n + 1];
if (n % 4 != 0 && n % 4 != 1) {
System.out.println(-1);
return;
}
for (int i = 1; i <= n / 2; i += 2) {
a[i] = i + 1;
a[i + 1] = n - i + 1;
a[n - i + 1] = n - i;
a[n - i] = i;
}
if (n % 2 == 1)
a[n / 2 + 1] = n / 2 + 1;
for (int i = 1; i <= n; i++)
System.out.print(a[i] + " ");
}
public static void main(String[] args) {
solve();
}
}
Python
n = int(input())
a = [x + 1 for x in range(n)]
if n % 4 == 0:
l1 = (n - 1) // 2
r1 = n // 2
v1 = 1
v2 = n
s = 0
while l1 >= 0:
a[l1] = v1
a[r1] = v2
if s:
a[l1], a[r1] = a[r1], a[l1]
l1 -= 1
r1 += 1
v1 += 1
v2 -= 1
s ^= 1
print(*a)
elif n % 4 == 1:
a[n // 2] = (n + 1) // 2
l = n // 2 - 1
r = n // 2 + 1
l2 = 1
r2 = n
s = 0
while l >= 0:
a[l] = l2
a[r] = r2
if s:
a[l], a[r] = a[r], a[l]
l -= 1
r += 1
l2 += 1
r2 -= 1
s ^= 1
print(*a)
else:
print(-1)
在一个神秘的迷宫中,小红找到了一个数字排列 a,但他不确定具体的排列是什么。他只记得这个排列满足特殊的规律:aai=n−i+1 并且排列的长度为 n。现在,他需要你的帮助来解开这个谜题。
排列是指一个长度为 len 的整数数组,数组中包含 1 到 len 的每个数,且每个数只出现一次。
你能帮助小红还原这个神秘的数字排列吗?
输入包含一个整数 n,表示排列的长度。
1≤n≤105
输出一行 n 个整数,表示还原的排列。如果有多个答案,输出任意一个即可,如果没有答案输出 −1。
输入
5
输出
2 5 3 1 4
说明
这样,还原的排列为 [2,5,3,1,4]。在这个神秘的迷宫中,你成功地帮助小红解开了这个数字排列的谜题。