#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int first {0};
int second {0};
int T{0};
void check_array(vector<long int> vec){
for (long int i_j=0;i_j<first;++i_j){
long int answ= abs(vec[i_j] - (i_j + 1));
if (answ!=second){
if (std::next_permutation(vec.begin(),vec.end())){
//std::cout<<"-1"<<endl;
check_array(vec);
}
else {
//std::next_permutation(veci.begin(),veci.end()); may not need this
std::cout<<"-1"<<endl;
return;
}
}
else{
if (i_j==first -1){
// output permutated vector
for (int r=0;r<first;++r){
cout << vec[r]<< " ";
if (r==first-1){
cout<<""<<endl;
return;
}
}
}
else{
continue;
}
}
} //end for loop
return;
}//end function
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
cin >>T;
for (long int i=0;i<T;++i){
cin >> first;
cin >> second;
vector<long int> veci (first,0);
for (int i_o=0;i_o<first;++i_o){
veci[i_o]=i_o+1;
}
check_array(veci);
}
return 0;
}
我有一个问题,我试图解决这个问题以获得向量的绝对置换。第一个输入是测试用例的数量,下一个输入是数组大小,第三个输入是绝对置换的值。 样本输入
3
2 1
3 0
3 2
示例输出
2 1
1 2 3
-1
解释:我们想要一个输出1的两个字符数组(我们的第一个排列是1,2,3,...... n,我们尝试排列,直到我们得到一个排列,给出1作为所有数组索引的答案:vec [i] - (i + 1)== 1,
对于下一个测试用例,我们需要一个三字符数组,其中vec [i] - (i + 1)== 0;所以我们要寻找的排列是1 2 3
对于最后一个测试用例,没有可用于满足要求的排列,因此我们打印-1; 我的循环循环次数太多并给出以下输出,我已经在这里停留了几天:
2 1
2 1
1 2 3
-1
3 2 1
-1
3 2 1
-1
3 2 1
-1
-1
3 2 1
-1
3 2 1
2 3 1
-1
3 2 1
-1
3 2 1
-1
3 2 1
-1
-1
3 2 1
-1
3 2 1
Instead of:
2 1
1 2 3
-1