2017-04-05 7 views
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; 
} 
+0

'int N [T]、K [T];' - それを止めます。 VLAは、C++の非標準コンパイラ拡張であることが最善です。 'std :: vector 'を使ってください。 – WhozCraig

+0

私の他のプログラムで働いています。何が問題なのですか? –

+0

配列のサイズが一定でない場合は、関数の途中で配列の動的スタック割り当てをコンパイラが生成する必要があることを意味します。少なくとも、Tが意味をなさないとロードされた後は、すべてのC++コンパイラでコンパイルできないことがあります。私はこのために新しい/削除をお勧めします。 – PaulHK

答えて

0

配列は、コンパイル時に構造の寸法を知っているときに使用する構造体です。 abs_perm()のbeginで書いたものは、標準コンパイラでは正しくありません(実際には配列の次元が分かりません)。メモリを動的に割り当てるstd :: vectorまたはstd :: listを使うことができます。あるいは、内部に入れるすべての要素を確実に含む次元を持つ配列を割り当てることができます。

関連する問題