2013-11-20 43 views
1

我刚刚完成初学者级别的编程,正在尝试从奥林匹克的问题。其相对容易,但我从网上法官的10个输入只得到一个正确的答案。 这里是链接:http://opc.iarcs.org.in/index.php/problems/SORTROWS代码未被在线评审接受

顺便说一句我正在使用外部文件输入,使输入数据更容易。 任何帮助或提示将会有所了解。 任何人都可以提出一种快速测试随机数据的方法吗?我无法在比赛中再制作一个节目。 在线法官采用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; 
} 
+0

for one,for(m = 0; m

+0

因为最后一个元素不应该被打印。 – Sumedh

+0

@Sumedh如果你正在谈论最后的-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++) 
+0

好吧,我明白了。必须说这是我的一个可笑的粗心的错误 – user3014044

1

我张贴这是因为它单独答案与我之前的完全不同。

一个更好的办法来解决这个问题。将使用std ::阵列

std::vector< std::array<int> > 

这样你就可以将每个数组作为一个单一的实体,并按照this C++ Link比较运营商将通俗易懂工作像的矢量在一维数组中。

你不需要自己遍历子数组。

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

+0

感谢您的提示。我对矢量相当陌生,所以这很有帮助 – user3014044

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

或偶数。

+0

是的,这只是在粘贴问题中的代码时发生意外。将从现在开始避免这些失误 – user3014044