关于歧义排列的代码问题

Code issues regarding Ambiguous Permutations

本文关键字:排列 代码 问题 歧义 于歧义      更新时间:2023-10-16

考虑这个问题:歧义排列。我的代码是用 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 Ambiguousn";
                break;
            }
        }
        if(c==true)
            cout << "Ambiguousn";
    }
    return 0;
}

只要在换行符中输入每个数字,这段代码就可以正常工作。如果我开始提供由空格分隔的输入(用于排列),那么代码的行为会出乎意料。它要求条件while((cin>> num)的无效输入,并在一轮输入后退出。对于解决这个问题有什么建议吗?我也想知道如果使用STL数组将是一个很好的选择。谢谢!

您的输入不正确,特别是这里-

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

一个更清晰(因此没有bug)的方法是-

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

第二个问题-

我也想知道使用STL数组是否是一个好的选择。

我建议在这里使用std::vector(大多数情况下)。

您的代码有问题。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 Ambiguousn";
                 break;
            }
         }
         if(c==true)
             cout << "Ambiguousn";
     }
     return 0;
}

然而,在这两种情况下,你的结果都是不正确的,它输出如下:

4
1 4 3 2
Not Ambiguous
5
2 3 4 5 1
Not Ambiguous
1
1
Ambiguous

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