#include <iostream> #include <vector> #include <unordered_set> #include <string> using namespace std; const int N = 100; // Rozmiar ekranu 100x100 vector<vector<int>> screen(N, vector<int>(N, 0)); // 100x100 pikseli, wszystkie początkowo wyłączone // Funkcja konwertująca grid (ekran) na ciąg znaków string to_string(const vector<vector<int>>& grid) { string result = ""; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { result += (grid[i][j] == 1 ? '1' : '0'); } } return result; } // Funkcja do wykrywania złych 2x2 kwadratów i zmiany stanu pikseli void update_screen(vector<vector<int>>& grid) { vector<vector<int>> temp = grid; // Kopia ekranu, na którym będziemy wykonywać zmiany for (int i = 0; i < N - 1; ++i) { for (int j = 0; j < N - 1; ++j) { // Sprawdzamy, czy mamy "zły" 2x2 kwadrat (dwa przeciwległe piksele zapalone) int sum = grid[i][j] + grid[i+1][j] + grid[i][j+1] + grid[i+1][j+1]; if (sum == 2) { // Jeśli tak, zmieniamy stany pikseli w tym kwadracie temp[i][j] = 1 - grid[i][j]; temp[i+1][j] = 1 - grid[i+1][j]; temp[i][j+1] = 1 - grid[i][j+1]; temp[i+1][j+1] = 1 - grid[i+1][j+1]; } } } grid = temp; // Zaktualizuj ekran } int main() { // Inicjalizacja ekranu z losową konfiguracją (dla uproszczenia) for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { screen[i][j] = rand() % 2; // Losowy stan pikseli } } unordered_set<string> seen_configurations; // Zbiór do śledzenia unikalnych konfiguracji int seconds = 0; // Symulacja zmiany konfiguracji ekranu while (true) { string config = to_string(screen); // Konwertuj ekran na ciąg znaków if (seen_configurations.count(config)) { break; // Zatrzymaj, jeśli konfiguracja się powtarza } seen_configurations.insert(config); // Dodaj nową konfigurację do zbioru update_screen(screen); // Zaktualizuj ekran seconds++; } // Wyświetlenie początkowej konfiguracji ekranu cout << "Początkowa konfiguracja:" << endl; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { cout << screen[i][j]; } cout << endl; } cout << "Liczba sekund, po których konfiguracja się powtórzyła: " << seconds << endl; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include <iostream> #include <vector> #include <unordered_set> #include <string> using namespace std; const int N = 100; // Rozmiar ekranu 100x100 vector<vector<int>> screen(N, vector<int>(N, 0)); // 100x100 pikseli, wszystkie początkowo wyłączone // Funkcja konwertująca grid (ekran) na ciąg znaków string to_string(const vector<vector<int>>& grid) { string result = ""; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { result += (grid[i][j] == 1 ? '1' : '0'); } } return result; } // Funkcja do wykrywania złych 2x2 kwadratów i zmiany stanu pikseli void update_screen(vector<vector<int>>& grid) { vector<vector<int>> temp = grid; // Kopia ekranu, na którym będziemy wykonywać zmiany for (int i = 0; i < N - 1; ++i) { for (int j = 0; j < N - 1; ++j) { // Sprawdzamy, czy mamy "zły" 2x2 kwadrat (dwa przeciwległe piksele zapalone) int sum = grid[i][j] + grid[i+1][j] + grid[i][j+1] + grid[i+1][j+1]; if (sum == 2) { // Jeśli tak, zmieniamy stany pikseli w tym kwadracie temp[i][j] = 1 - grid[i][j]; temp[i+1][j] = 1 - grid[i+1][j]; temp[i][j+1] = 1 - grid[i][j+1]; temp[i+1][j+1] = 1 - grid[i+1][j+1]; } } } grid = temp; // Zaktualizuj ekran } int main() { // Inicjalizacja ekranu z losową konfiguracją (dla uproszczenia) for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { screen[i][j] = rand() % 2; // Losowy stan pikseli } } unordered_set<string> seen_configurations; // Zbiór do śledzenia unikalnych konfiguracji int seconds = 0; // Symulacja zmiany konfiguracji ekranu while (true) { string config = to_string(screen); // Konwertuj ekran na ciąg znaków if (seen_configurations.count(config)) { break; // Zatrzymaj, jeśli konfiguracja się powtarza } seen_configurations.insert(config); // Dodaj nową konfigurację do zbioru update_screen(screen); // Zaktualizuj ekran seconds++; } // Wyświetlenie początkowej konfiguracji ekranu cout << "Początkowa konfiguracja:" << endl; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { cout << screen[i][j]; } cout << endl; } cout << "Liczba sekund, po których konfiguracja się powtórzyła: " << seconds << endl; return 0; } |