Advertisement
Mrowqa

XXI OI - sprawdzaczka do zadania "Klocki"

Oct 14th, 2013
811
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.06 KB | None | 0 0
  1. /**
  2.  * Sprawdzarka dla zadania "Klocki" XXI Olimpiady Informatycznej
  3.  * @author: Artur Jamro "Mrowqa"
  4.  * @version: 1.3
  5.  */
  6.  
  7.  
  8. #include <fstream>
  9. #include <string>
  10. #include <vector>
  11. #include <iostream>
  12. #include <cstdlib>
  13. using namespace std;
  14.  
  15. void loadAnswer(string filename, vector<int>& answer);
  16. void countNumbers(const vector<int>& numbers, vector<int>& out);
  17.  
  18. int main(int argc, char* argv[])
  19. {
  20.     if(argc < 3)
  21.     {
  22.         cout << "usage: klochk <test.out> <correct.out>\n";
  23.         return 2;
  24.     }
  25.  
  26.     string testOut(argv[1]);
  27.     string correctOut(argv[2]);
  28.     vector<int> testAnswer;
  29.     vector<int> correctAnswer;
  30.     testAnswer.reserve(1000000);
  31.     correctAnswer.reserve(1000000);
  32.    
  33.     loadAnswer(testOut, testAnswer);
  34.     loadAnswer(correctOut, correctAnswer);
  35.  
  36.     if(testAnswer.size() != correctAnswer.size())
  37.     {
  38.         cout << "ZLE! Rozna liczba klockow!\n";
  39.         return 1;
  40.     }
  41.     if( testAnswer[0] != correctAnswer[0] ||
  42.         testAnswer[testAnswer.size()-1] != correctAnswer[correctAnswer.size()-1])
  43.     {
  44.         cout << "ZLE! Skrajne elementy sie roznia!\n";
  45.         return 1;
  46.     }
  47.  
  48.     int last = -1;
  49.     for(int elem : testAnswer)
  50.     {
  51.         if(elem == last)
  52.         {
  53.             cout << "ZLE! Klocki tego samego koloru jeden za drugim!\n";
  54.             return 1;
  55.         }
  56.         last = elem;
  57.     }
  58.  
  59.     vector<int> testNumCnt;
  60.     vector<int> correctNumCnt;
  61.    
  62.     countNumbers(testAnswer, testNumCnt);
  63.     countNumbers(correctAnswer, correctNumCnt);
  64.  
  65.     for(size_t i=0; i<testNumCnt.size(); i++)
  66.         if(testNumCnt[i] != correctNumCnt[i])
  67.         {
  68.             cout << "ZLE! Rozne ilosci klockow tego samego koloru!\n";
  69.             return 1;      
  70.         }
  71.    
  72.     cout << "OK";
  73.     return 0;
  74. }
  75.  
  76. void loadAnswer(string filename, vector<int>& answer)
  77. {
  78.     fstream file(filename, ios_base::in);
  79.     if(file.is_open())
  80.     {
  81.         answer.clear();
  82.         int num;
  83.  
  84.         while(!file.eof())
  85.         {
  86.             file >> num;
  87.             if(!file) break;
  88.             answer.push_back(num);
  89.         }
  90.     }
  91.     else
  92.     {
  93.         cerr << "Nie mozna otworzyc pliku: " << filename << "!\n";
  94.         exit(1);
  95.     }
  96. }
  97.  
  98. void countNumbers(const vector<int>& numbers, vector<int>& out)
  99. {
  100.     out = vector<int>(1000000, 0);
  101.  
  102.     for(auto elem : numbers)
  103.         out[elem]++;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement