Advertisement
Guest User

Untitled

a guest
Apr 21st, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.82 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. #include <iomanip>
  5. #include <ctime>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <string>
  9. #include <sstream>
  10. #include <iterator>
  11.  
  12. bool Compare(std::vector<int>::iterator iterElem, std::vector<int>::iterator end, std::vector<int> target);
  13. unsigned BinSearch(std::vector<int>::iterator left, std::vector<int>::iterator right, int tgt);
  14.  
  15. int main()
  16. {
  17. setlocale(LC_ALL, "Rus");
  18. int n, m;
  19. m1: for (;;)
  20. {
  21. std::cout << "Введите количество строк (от 1 до 15): ";
  22. if (!(std::cin >> n) || n < 1 || n > 15)
  23. {
  24. std::cin.clear();
  25. std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  26. std::cout << "Ошибка" << std::endl;
  27. continue;
  28. }
  29. std::cout << "Введите количество столбцов (от 1 до 15): ";
  30. if (!(std::cin >> m) || m < 1 || m > 15)
  31. {
  32. std::cin.clear();
  33. std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  34. std::cout << "Ошибка" << std::endl;
  35. continue;
  36. }
  37. break;
  38. }
  39. srand(time(0));
  40. std::vector<std::vector<int>> matrix;
  41. for (auto j = 0; j < m; ++j)
  42. {
  43. std::vector<int> buf;
  44. for (auto i = 0; i < n; ++i)
  45. buf.push_back(rand() % 201 - 100);
  46. matrix.push_back(buf);
  47. }
  48. std::cout << "\nИзначальный массив:\n" << std::endl;
  49. for (auto i = 0; i < n; ++i)
  50. {
  51. for (const auto& column : matrix)
  52. printf("%4d ", column[i]);
  53. std::cout << std::endl;
  54. }
  55. std::string line;
  56. std::vector<int> numbers;
  57. std::cout << "Введите элемент (последовательность элементов через пробел) для поиска: " << std::endl;
  58. std::cin.clear();
  59. std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  60. std::getline(std::cin, line);
  61. std::istringstream stream(line);
  62. std::copy(std::istream_iterator<int>(stream),
  63. std::istream_iterator<int>(),
  64. std::back_inserter(numbers));
  65.  
  66. for (auto column = matrix.begin() + 1; column != matrix.end(); ++++column)
  67. for (auto elem = (*column).begin(); elem != (*column).end(); ++elem)
  68. if (Compare(elem, (*column).end(), numbers))
  69. std::cout << "(" << std::distance((*column).begin(), elem) + 1
  70. << ", " << std::distance(matrix.begin(), column) + 1 << ')' << std::endl;
  71.  
  72. int target;
  73. for (;;)
  74. {
  75. std::cout << "Введите элемент для бинарного поиска: " << std::endl;
  76. if (!(std::cin >> target))
  77. {
  78. std::cin.clear();
  79. std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  80. std::cout << "Ошибка" << std::endl;
  81. continue;
  82. }
  83. break;
  84. }
  85. unsigned idx = 1;
  86. for (auto column : matrix)
  87. {
  88. std::sort(column.begin(), column.end());
  89. std::cout << "Найдено в " << idx++ << " столбце: "
  90. << BinSearch(column.begin(), column.end() - 1, target) << std::endl;
  91. }
  92. system("pause");
  93. return 0;
  94. }
  95.  
  96. bool Compare(std::vector<int>::iterator iterElem, std::vector<int>::iterator end, std::vector<int> target)
  97. {
  98. if (std::distance(iterElem, end) < std::distance(target.begin(), target.end()))
  99. return false;
  100. for (auto iterTarget = target.begin();
  101. iterElem != end && iterTarget != target.end();
  102. ++iterElem, ++iterTarget)
  103. {
  104. if (*iterElem != *iterTarget)
  105. return false;
  106. }
  107. return true;
  108. }
  109.  
  110. unsigned BinSearch(std::vector<int>::iterator left, std::vector<int>::iterator right, int tgt)
  111. {
  112. if (left > right)
  113. return 0;
  114. const auto avg = left + (right - left) / 2;
  115. if (tgt < *avg)
  116. return BinSearch(left, avg - 1, tgt);
  117. else if (tgt > *avg)
  118. return BinSearch(avg + 1, right, tgt);
  119. else
  120. {
  121. unsigned count = 1;
  122. if (avg != right)
  123. for (auto tmp = avg + 1; tmp != right && *tmp++ == tgt; count++);
  124. if (avg != left)
  125. for (auto tmp = avg - 1; tmp != left && *tmp-- == tgt; count++);
  126. return count;
  127. }
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement