0
私はHackerRankの絶対順列問題についてこの解を書きました。 dev-C++ではうまく動作しますが、Hackerrankでは動作しません。私は、abs_perm()を削除すると、コードが出力を生成することがわかりました。ここで何が問題なの?HackerRankはstdout〜で応答がありませんと言っています。 C++
#include <iostream>
using namespace std;
int arr[100000];
int check(int n, int k)
{
if ((2*k == n) || (k == 0) || (n - 4*k == 0))
return 1;
else if (k < n/2)
return check(n - 4*k, k);
else
return 0;
}
void swap(int &a, int &b)
{
int c = b;
b = a;
a = c;
}
void ini(int n)
{
for (int i = 0; i < n; i++)
{
arr[i] = i+1;
}
}
void abs_perm(int n, int k)
{
for (int i = 0; i < k; i++)
{
swap(arr[i], arr[k+i]);
}
if (2*k == n)
return;
for (int i = n - 1; i > n - k - 1; i--)
{
swap(arr[i], arr[i-k]);
}
if (n - 4*k == 0)
return;
abs_perm(n - 4*k, k);
}
int main()
{
int T;
cin >> T;
int N[T], K[T];
for (int i = 0; i < T; i++)
{
cin >> N[i] >> K[i];
}
for (int i = 0; i < T; i++)
{
cout << N[i] << " " << K[i] << "\n";
}
for (int i = 0; i < T; i++)
{
if (!check(N[i], K[i]))
cout << "-1\n";
else
{
ini(N[i]);
abs_perm(N[i], K[i]);
for (int j = 0; j < N[i]; j++)
{
cout << arr[j] << " ";
}
cout << "\n";
}
}
return 0;
}
'int N [T]、K [T];' - それを止めます。 VLAは、C++の非標準コンパイラ拡張であることが最善です。 'std :: vector'を使ってください。 –
WhozCraig
私の他のプログラムで働いています。何が問題なのですか? –
配列のサイズが一定でない場合は、関数の途中で配列の動的スタック割り当てをコンパイラが生成する必要があることを意味します。少なくとも、Tが意味をなさないとロードされた後は、すべてのC++コンパイラでコンパイルできないことがあります。私はこのために新しい/削除をお勧めします。 – PaulHK