2013-11-20 49 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