代码未被在线法官接受

时间:2013-11-20 17:12:52

标签: c++ arrays sorting structure selection-sort

我刚刚完成了初学者级别的编程,并且正在尝试从奥林匹克运动会出来的问题。它相对容易,但我从在线评判的10个输入中只得到一个正确的答案。 这是链接:http://opc.iarcs.org.in/index.php/problems/SORTROWS

BTW我正在使用外部文件进行输入,以便更轻松地输入数据。 任何帮助或提示将被欣赏。 谁能建议一种快速测试随机数据的方法?我不能在比赛期间制定另一个计划。 在线评判使用g ++编译器

现在这是我的代码:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream ifs("test.txt");
    struct ac
    {
           int arr[51];
           int size;
    }ar[1000];  //represents each line
    int i,j,n,m,in,pos,k;
    ac small;
    ifs>>n;
    for(i=0;i<n;i++)
    {
           for(j=0;;j++)
           {
                 ifs>>in;
                 ar[i].arr[j]=in;
                 if(in==-1)
                 {
                      ar[i].size=j+1;
                      break;
                 }
           }

    }
    for(i=0;i<n;i++)   //using selection sort
    {
           pos=i;
           small=ar[i];
           for(j=i+1;j<n;j++)
           {
                 for(k=0;k<ar[j].size&&k<ar[i].size;k++)
                 {
                      if(ar[i].arr[k]>ar[j].arr[k])
                      {
                              small=ar[j];
                              pos=j;
                      }
                      else if(ar[i].arr[k]==ar[j].arr[k]) //to continue checking
                              continue;
                              break;
                 }
           }
           ar[pos]=ar[i];
           ar[i]=small;
           for(m=0;m<ar[i].size-1;m++)
                 cout<<ar[i].arr[m]<<' ';
           cout<<'\n';
    }
    return 0;
}

3 个答案:

答案 0 :(得分:1)

我将此作为单独的答案发布,因为它与我之前的答案完全不同。

解决此问题的更好方法是使用std :: arrays

的向量
std::vector< std::array<int> >

通过这种方式,您可以将每个数组视为单个实体,并且根据this C++ Link,比较运算符可以像在一维数组中那样直接工作。

您不需要自己遍历子阵列。

当然,您需要在编译器中启用C ++ 11功能。

答案 1 :(得分:0)

您应该将每个子数组与当前最小的子数组进行比较,而不是使用第i个子数组。

for(k=0;k<ar[j].size&&k<ar[i].size;k++)
{
  if(ar[i].arr[k]>ar[j].arr[k])

尝试将其更改为:

for(k=0;k<ar[j].size&&k<ar[pos].size;k++)
{
  if(ar[pos].arr[k]>ar[j].arr[k])

另外,IMO你不应该在数组中输入最后一个-1条目。

ar[i].arr[j]=in;
if(in==-1)
{
  ar[i].size=j+1;
  break;
}

将其更改为:

if ( in != -1 ) {
  ar[i].arr[j]=in;
  ar[i].size=j+1;
}
else
{ 
  break;
}

然后你必须改变

for(m=0;m<ar[i].size-1;m++)

for(m=0;m<ar[i].size;m++)

答案 2 :(得分:0)

这是一个评论而不是一个答案,我发布它是为了更好的格式化可能性。除了别人说的话:

else if(ar[i].arr[k]==ar[j].arr[k]) //to continue checking
    continue;
    break;

您知道在比较为假的情况下会执行break,对吧?如果是有意的话,最好将其格式化以强调这一点,例如:

else if(ar[i].arr[k]==ar[j].arr[k]) //to continue checking
    continue;

break;

或甚至使用明确的else