0

考虑这个问题:歧义排列。我的代码是使用 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) 的输入无效,并在一轮输入后退出。有什么建议可以消除这个问题吗?我还想知道使用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);
}

对于你的第二个问题-

我还想知道使用 STL 数组是否是一个不错的选择。

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

于 2013-03-15T19:19:55.433 回答
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

虽然第一个应该是“歧义”,但您可能需要检查检查歧义的逻辑。

于 2013-03-15T19:23:13.250 回答