0

この質問を考えてみましょう: Ambiguous Permutation . 私のコードはG++ 4.7.2 を使用して C++11で書かれています

#include<iostream>
#include<vector>

using std::cin;
using std::cout;
using std::vector;

int main()
{
    int h;
    while((cin >> h) && (h!=0))
    {
        int num;
        bool c=true;
        vector<int> arr;
        while((cin >> num) && (h!=0))
        {
            arr.push_back(num);
            --h;
        }
        const auto n = arr.size();
        for(int i=0; i!=n; ++i)
        {
            if(arr[arr[i]-1] != (i+1))
            {
                c = false;
                cout << "Not Ambiguous\n";
                break;
            }
        }
        if(c==true)
            cout << "Ambiguous\n";
    }
    return 0;
}

このコードは、改行にすべての数字を入力する限り正常に機能します。(順列のために) 空白で区切られた入力を提供し始めると、コードは予期しない動作をします。条件 while((cin >> num) に対して無効な入力を要求し、1 回の入力後に終了します。この問題を解決するための提案はありますか? また、STL 配列を使用するのが良い選択であるかどうかも疑問に思っていました。ありがとう!

4

2 に答える 2

2

特にここでは、入力を間違っています-

    while((cin >> num) && (h!=0)) //WRONG!
    {
        arr.push_back(num);
        --h;
    }

それを行うためのより明確な(したがってバグのない)方法は-

for (int i = 0; i < h; i++)
{
    cin >> num;
    arr.push_back(num);
}

2 番目の質問については、

また、STL 配列を使用するのが良い選択であるかどうかも疑問に思っていました。

std::vectorここで(そしてほとんどの目的で)使用することをお勧めします。

于 2013-03-15T19:19:55.433 に答える
1

あなたのコードには何か問題があります。1. 各順列の数値を取得するときは、h!=1 を使用する必要があります。現在の実装では、奇妙です。h =4 の場合、意味をなさない 5 つの数値を要求することになります。 2. 次のことができます。次のように、スペースで区切られた 1 行で、各テスト ケースのこれらの数値を確実に読み取ってください。

#include<iostream>
#include<vector>

using std::cin;
using std::cout;
using std::vector;

int main()
{
   int h;
   while((cin>> h) && (h!=0))
   {
        int num;
        bool c=true;
        vector<int> arr;
        while((cin >>  std::skipws >> num) && (h!=1))
        {            //^^^^^^^^^^^^^(add this) ^^^^^^^here should be 1 not 0
           arr.push_back(num);
           --h;
        }

        const auto n = arr.size();
        for(int i=0; i!=n; ++i)
        {
            if(arr[arr[i]-1] != (i+1))
            {
                 c = false;
                 cout << "Not Ambiguous\n";
                 break;
            }
         }

         if(c==true)
             cout << "Ambiguous\n";
     }
     return 0;
}

ただし、どちらの場合も、結果は正しくありません。次のように出力されます。

4
1 4 3 2
Not Ambiguous

5
2 3 4 5 1
Not Ambiguous
1
1
Ambiguous

最初は「あいまい」である必要がありますが、あいまいさをチェックするためのロジックを確認する必要がある場合があります。

于 2013-03-15T19:23:13.250 に答える