Advertisement
dmkozyrev

193_gen.cpp

Jun 24th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. #include <vector>
  2. #include <cstdlib>
  3. #include <stdio.h>
  4.  
  5. std::vector<std::vector<int>> read(int len);
  6.  
  7. void print(const std::vector<std::vector<int>> & data, int len);
  8.  
  9. void next(int len);
  10.  
  11. int main() {
  12. /*  
  13.     В одной папке с программой должен лежать файл file4.txt со следующим содержанием:
  14.         6
  15.         1 2 3 4
  16.         1 2 4 3
  17.         1 3 2 4
  18.         1 3 4 2
  19.         1 4 2 3
  20.         1 4 3 2
  21. */
  22.    
  23.     int low = 4, high = 12;
  24.    
  25.     for (int len = low; len < high; ++len)
  26.         next(len);
  27.    
  28.     return 0;
  29. }
  30.  
  31. bool correct_pos(int pos, const std::vector<int> & v) {
  32.     if (pos >= (int) v.size()) return false;
  33.    
  34.     if (pos == (int) v.size()-1 && abs(v[pos] - v[pos-1]) <= 3) return true;
  35.    
  36.     if (pos == 0 && abs(v[pos]-v[pos+1]) <= 3) return true;
  37.    
  38.     if (abs(v[pos]-v[pos-1]) <= 3 && abs(v[pos]-v[pos+1]) <= 3) return true;
  39.    
  40.     return false;  
  41. }
  42.  
  43. void print(const std::vector<std::vector<int>> & data, int len) {
  44.     char output[100];
  45.    
  46.     sprintf(output, "file%d.txt", len);
  47.    
  48.     FILE * file_out = fopen(output, "wt");
  49.    
  50.     fprintf(file_out, "%d\n", (int) data.size());
  51.    
  52.     for (auto & row : data) {
  53.         for (auto & it : row)
  54.             fprintf(file_out, "%d ", it);
  55.         fprintf(file_out, "\n");
  56.     }
  57.    
  58.     fclose(file_out);
  59. }
  60.  
  61. void next(int len) {
  62.    
  63.     auto data = read(len);
  64.    
  65.     std::vector<std::vector<int>> answer (3 * (int)data.size(), std::vector<int>(len+1));
  66.    
  67.     int count = 0;
  68.    
  69.     std::vector<int> temp (len+1);
  70.    
  71.     for (auto & row : data) {
  72.        
  73.         for (int i = 0; i < len; ++i)
  74.             temp[i] = row[i];
  75.            
  76.         temp[len] = len+1;
  77.        
  78.         for (int i = len; i > 0; --i) {
  79.             if (correct_pos(i, temp)) {
  80.                 for (int j = 0; j <= len; ++j)
  81.                     answer[count][j] = temp[j];
  82.                 count++;
  83.             }
  84.            
  85.             std::swap(temp[i], temp[i-1]); 
  86.         }
  87.        
  88.     }
  89.    
  90.     answer.resize(count);
  91.    
  92.     print(answer, len+1);
  93. }
  94.  
  95. std::vector<std::vector<int>> read(int len) {
  96.     char input[100];
  97.    
  98.     sprintf(input, "file%d.txt", len);
  99.    
  100.     FILE * file_in = fopen(input, "rt");
  101.    
  102.     int count;
  103.     fscanf(file_in, "%d", &count);
  104.    
  105.     std::vector<std::vector<int>> data(count, std::vector<int>(len));
  106.    
  107.     for (auto & row : data)
  108.         for (auto & it : row)
  109.             fscanf(file_in, "%d", &it);
  110.    
  111.     fclose(file_in);
  112.    
  113.     return data;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement