Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.05 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include<iostream>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <string>
  6.  
  7.  
  8.  
  9.  
  10.  
  11. using namespace std;
  12. int MAX = 50;
  13. const int MacierzMax = 50;
  14. int macierzRobocza[MacierzMax + 1][MacierzMax + 1];
  15. int minIloscMacierzRobocza = 0;
  16. int wynik[MacierzMax + 1][MacierzMax + 1];
  17. int minIloscWynik = 0;
  18.  
  19.  
  20. /*
  21.  
  22. Macierz jest wypełniona nastepującymi liczbami
  23. -1 - pole nieuzupełnione
  24. 0 - pole usupełnione
  25. 0 < n - lewy górny róg (długość wstawionego kwadratu)
  26.  
  27. */
  28.  
  29. void kopiujMacierz()
  30. {
  31. minIloscWynik = 0;
  32. for (int i = 1; i <= MAX; i++)
  33. {
  34. for (int j = 1; j <= MAX; j++)
  35. {
  36. if (macierzRobocza[i][j] > 0) {
  37. minIloscWynik++;
  38. }
  39. wynik[i][j] = macierzRobocza[i][j];
  40. }
  41. }
  42. }
  43.  
  44. // Wypełniam kwadrat kwadratem Max - 1
  45. // Generuje pustą macierz
  46. void generujMacierz()
  47. {
  48. for (int i = 1; i <= MAX; i++)
  49. {
  50. for (int j = 1; j <= MAX; j++)
  51. macierzRobocza[i][j] = -1;
  52. }
  53. }
  54.  
  55.  
  56. void dodajBadanyKwadrat(int dlKwadratu)
  57. {
  58. for (int i = 1; i <= dlKwadratu; i++)
  59. {
  60. for (int j = 1; j <= dlKwadratu; j++)
  61. {
  62. macierzRobocza[i][j] = 0;
  63. }
  64. }
  65. macierzRobocza[1][1] = dlKwadratu;
  66. }
  67.  
  68. // Wyświetlam macierz kwadratu
  69. void wyswietlMacierz(int macierz[MacierzMax + 1][MacierzMax + 1])
  70. {
  71. for (int i = 1; i <= MAX; i++)
  72. {
  73. for (int j = 1; j <= MAX; j++)
  74. {
  75. printf(" %d ", macierz[i][j]);
  76. }
  77. printf("\n");
  78. }
  79. }
  80.  
  81.  
  82. // Dodaje kwadrat do macierzy
  83. void wstawKwadrat(int x, int y, int dl)
  84. {
  85. int dlmin = dl - 1;
  86.  
  87. for (int i = x; i <= x + dlmin; i++)
  88. {
  89. for (int j = y; j <= y + dlmin; j++)
  90. {
  91. macierzRobocza[i][j] = 0;
  92. }
  93. }
  94. macierzRobocza[x][y] = dl;
  95. // ustawiam kordy i zeruje reszte pól
  96.  
  97. }
  98.  
  99.  
  100.  
  101. void Poka(int macierz[MacierzMax + 1][MacierzMax + 1])
  102. {
  103. for (int i = 1; i <= MAX; i++)
  104. {
  105. for (int j = 1; j <= MAX; j++)
  106. {
  107. if (macierz[i][j] > 0) {
  108. printf("x:%d, y:%d, %d \n", i, j, macierz[i][j]);
  109. }
  110. }
  111. }
  112. }
  113.  
  114.  
  115. // Sprawdzam czy kwadrat jest wypełniony
  116. bool sprawdzCzySaUzupelnionePola()
  117.  
  118. {
  119. minIloscMacierzRobocza = 0;
  120. for (int i = 1; i <= MAX; i++)
  121. {
  122. for (int j = 1; j <= MAX; j++)
  123. {
  124. if (macierzRobocza[i][j] < 0) // jeżeli dana komórka posiada wartość -1 tzn, że macierz nie jest uzupełniona
  125. {
  126. return false;
  127. }
  128. if (macierzRobocza[i][j] > 0) {
  129. minIloscMacierzRobocza++;
  130. }
  131. }
  132.  
  133. }
  134. return true;
  135. }
  136. bool sprawdzCzyMoznaDodacKwadrat(int x, int y, int dl)
  137. {
  138.  
  139. int dlmin = dl - 1;
  140. // Sprawdzam czy kwadrat nie wyjdzie poza macierz
  141. if (((x + dlmin) > MAX) || ((y + dlmin) > MAX))
  142. {
  143. return false;
  144. }
  145.  
  146. for (int i = x; i <= x + dlmin; i++)
  147. {
  148. for (int j = y; j <= y + dlmin; j++)
  149. {
  150. if (macierzRobocza[i][j] >= 0)
  151. {
  152. return false;
  153. }
  154. }
  155.  
  156. }
  157. wstawKwadrat(x, y, dl);
  158. return true;
  159. }
  160.  
  161. // Rekurencyjnie szukam kwadratu do wstawienia
  162. int szukajKwadratuDoWstawienia(int dlkwadratuDoWstawienia)
  163. {
  164. if (sprawdzCzySaUzupelnionePola())
  165. {
  166. return 0;
  167. }
  168.  
  169.  
  170. for (int i = 1; i <= MAX; i++)
  171. {
  172. for (int j = 1; j <= MAX; j++)
  173. {
  174. // Jeżeli pole nie jest zapełnione
  175. if (macierzRobocza[i][j] < 0) // szukam pola pustego i sprawdzam czy w tym polu moge doda
  176. {
  177. sprawdzCzyMoznaDodacKwadrat(i, j, dlkwadratuDoWstawienia);
  178. }
  179. }
  180. }
  181.  
  182. dlkwadratuDoWstawienia--;
  183. szukajKwadratuDoWstawienia(dlkwadratuDoWstawienia);
  184. }
  185.  
  186.  
  187. void znajdzMacierz() {
  188. minIloscWynik = 0;
  189. for (int i = MAX - 1; i > 0; i--)
  190. {
  191. generujMacierz();
  192. dodajBadanyKwadrat(i);
  193. szukajKwadratuDoWstawienia(MAX - 1);
  194. if (minIloscMacierzRobocza < minIloscWynik || (minIloscWynik == 0)) {
  195. kopiujMacierz();
  196. }
  197.  
  198. }
  199. printf("\n\n Wynik dla N = %d", MAX);
  200. printf("\n Najmniejsza ilosc kwadratow: %d \n\n", minIloscWynik);
  201. wyswietlMacierz(wynik);
  202. cout << endl;
  203. Poka(wynik);
  204. }
  205.  
  206. int main()
  207. {
  208. string line;
  209. ifstream myfile("example.txt");
  210. if (myfile)
  211. {
  212. while (getline(myfile, line))
  213. {
  214. int b = atoi(line.c_str());
  215. MAX = b;
  216. znajdzMacierz();
  217. }
  218. myfile.close();
  219. }
  220. else {
  221. cout << "\n cos nie działa \n";
  222. }
  223.  
  224. system("pause");
  225.  
  226. return 0;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement