【问题标题】:Code issues regarding Ambiguous Permutations关于歧义排列的代码问题
【发布时间】:2013-03-15 19:04:17
【问题描述】:

考虑这个问题: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) 并在一轮输入后退出。有什么建议可以消除这个问题吗?我还想知道使用STL Arrays 是否是一个不错的选择。谢谢!

【问题讨论】:

  • C++ 4.7.2 中没有这样的东西。如果您谈论的是编译器,请将其命名为 GCC 4.7.2,或者如果您谈论的是语言,请将其命名为 C++98/C++03/C++11。
  • @ybungalobill 完成!回答?

标签: c++ stl


【解决方案1】:

你输入错误,特别是这里-

    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(大多数情况下)。

【讨论】:

  • 这使得“无效输入需求”问题消失了,但代码执行在单轮输入后仍然终止,而只有当 h 的值输入为 0 时才会终止。
【解决方案2】:

你的代码有问题。 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

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

【讨论】:

  • 在稍作改动后,Vinayak Garg 建议代码可以正常工作。我剩下的唯一问题是代码执行在单轮输入后仍然终止,而只有当 h 的值输入为 0 时它才应该终止。虽然我不知道你为什么得到 Not Ambiguous序列1 4 3 2。我的工作正常。
  • @ChosenTorture 这太奇怪了。我可以输入所有 4 个用例,它会在测试用例下方的行上分别输出结果。同时,当我输入0作为数字时,程序停止从提示符读取,这是正确的。
  • @ChosenTorture 介意向您发布新代码,以便我可以运行看看会发生什么?
  • 我只是对 Vinayak Garg 建议的代码进行了微小的更改。看看他的回答。
  • @ChosenTorture 我按照 Garg 的指示更改了您的代码。我可以阅读所有测试用例,除非 h==0。我使用的是 GCC 3.4.3,所以很困惑为什么你不能阅读所有的测试用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 2022-08-02
  • 2010-12-05
相关资源
最近更新 更多