2013-11-20 2 views
1

Я только что закончил программирование на начальном уровне и попытаюсь решить проблему с олимпиады. его относительно легко, но я получаю только один правильный ответ от 10 входов онлайн-судьи. Вот ссылка: http://opc.iarcs.org.in/index.php/problems/SORTROWSКод не принимается онлайн-судьей

BTW Я использую внешний файл для ввода, чтобы упростить ввод данных. любая помощь или советы будут оценены. Может ли кто-нибудь предложить метод для быстрого тестирования случайных данных? я не могу позволить себе сделать еще одну программу для этого во время соревнований. лайн судья использует г ++ компилятор

теперь вот мой код:

#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

для одного, для (m = 0; m

+0

, потому что последний элемент не должен быть напечатан. – Sumedh

+0

@Sumedh Если вы говорите о последней записи -1, я думаю, что лучший способ - не вводить эту запись в массив и просто отклонить ее. –

ответ

0

Вы должны сравнить каждый суб-массив с текущей наименьшей подрешетки не с г-й подрешетке.

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]) 

Кроме того, ИМО не следует ввести последнюю -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 оператор сравнения будет откладывая работать как в 1D массиве.

Вам не нужно самостоятельно прокручивать субмассивы.

Конечно, в компиляторе вам понадобятся функции 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