我正在尝试解决UVA 195问题,但除了测试中的准确结果外,在线评判还会返回“运行时错误”。
称为“fatorial”的函数计算给定数字的阶乘。 称为“permutacoes”的函数计算给定单词的排列数。
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
int fatorial (int a){
int resultado = 1;
for(int i=1; i<=a; i++) resultado *= i;
return resultado;
}
int permutacoes (string s){
int t = s.length();
//conta as repetições de cada letra
int rep[t];
for(int i=0; i<t; i++) rep[i]=1;
for(int i=0; i<t; i++){
if(rep[i]==1){
for(int j=(i+1); j<t; j++){
if(s[i]==s[j]){
rep[i]++;
rep[j] = 0;
}
}
}
}
//Calcula o número de permutações
int fat = fatorial(t);
int dividendo = 1;
for(int i=0; i<t; i++){
if(rep[i]>1) dividendo *= fatorial(rep[i]);
}
int resultado = fat/dividendo;
return resultado;
}
int main()
{
int n;
string s;
cin>>n;
while(n--){
cin>>s;
sort(s.begin(),s.end()); //Ordem inicial
cout<<s<<endl; //Primeira saída
int perm = permutacoes(s);
//Todas as permutações, menos a primeira que já foi dada pelo sort
while (--perm){
next_permutation(s.begin(),s.end());
cout<<s<<endl;
}
}
return 0;
}
答案 0 :(得分:0)
问题可能在于您计算排列数的方式。该程序可能试图划分一些非常大的数字,但其中一个数字可能溢出(大于int
的最大值),因此不正确。
用单词“aaaaaaaaaabbbbbbbbbb”检查你的算法(10个字母'a'和10个字母'b')。你应该得到20!/(10!* 10!)= 184756排列,但我打赌你会得到一些其他价值。将程序输出重定向到文件,以便更快地完成。
要解决此问题,请移除函数permutacoes
并在next_permutation
返回true
时运行循环。当next_permutation
返回false时,不再有排列,并且该单词应按循环之前的顺序排序。