考虑这个问题: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是否是不错的选择谢谢!
答案 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;,但您可能需要检查逻辑以检查歧义。