有关模糊排列的代码问题

时间:2013-03-15 19:04:18

标签: c++ stl

考虑这个问题:Ambiguous Permutation。我的代码是用 C ++ 11使用G ++ 4.7.2

编写的
#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;
}

只要我在换行符中输入每个数字,此代码就可以正常工作。如果我开始提供由空格分隔的输入(用于置换),则代码会出现意外行为。它要求条件的无效输入((cin&gt;&gt; num)并在一轮输入后退出。有关删除此问题的任何建议吗?我也想知道使用STL Arrays是否是不错的选择谢谢!

2 个答案:

答案 0 :(得分: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);
}

关于你的第二个问题 -

  

我也想知道使用STL阵列是不是一个好选择。

我建议在这里使用std::vector(并且出于大多数目的)。

答案 1 :(得分:1)

您的代码存在问题。 1.当你得到每个排列的数字时,你应该使用h!= 1,在你当前的实现中,这很奇怪,如果h = 4,你将要求5个数字,这是没有意义的 2.您当然可以在空格分隔的一行中读取每个测试用例的数字,如下所示:

#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

虽然第一个应该是&#34;不明确的&#34;,但您可能需要检查逻辑以检查歧义。