#include <stdio.h>
#include <set>
#include <random>
#include <cstring>
using namespace std;
#define N 100
bool czy_zmienic[N*N];
class Plansza {
bool zaswiecone[N*N];
public:
Plansza(std::string s) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
zaswiecone[i*N+j] = s[i*N+j] == '1';
}
}
}
Plansza() {
for (int i=0;i <N; i++) {
zaswiecone[i]=1;
}
zaswiecone[N-1]=0;
for (int i = 1; i < N-1; i++) {
for(int j = 0; j < N; j++) {
zaswiecone[i*N+j] = j%2==0;
}
}
for(int i = 0; i < N; i++) {
zaswiecone[(N-1)*N+i] = 0;
}
zaswiecone[N*N-1]=1;
}
void wypisz() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (zaswiecone[i*N+j]) {
printf("1");
} else {
printf("0");
}
}
printf("\n");
}
}
void zamien(int i, int j) {
bool tmp = zaswiecone[i];
zaswiecone[i] = zaswiecone[j];
zaswiecone[j] = tmp;
}
void przegeneruj() {
memset(czy_zmienic, 0, sizeof(bool) * N * N);
for(int i = 1; i < N; i++) {
for(int j = 1; j < N; j++) {
if(zaswiecone[i*N+j]==zaswiecone[(i-1)*N+j-1] &&
zaswiecone[(i-1)*N+j]==zaswiecone[i*N+j-1] &&
zaswiecone[i*N+j]!=zaswiecone[(i-1)*N+j]) {
czy_zmienic[i*N+j] = true;
czy_zmienic[(i-1)*N+j] = true;
czy_zmienic[i*N+j-1] = true;
czy_zmienic[(i-1)*N+j-1] = true;
}
}
}
for(int i = 0; i < N*N; i++) {
if(czy_zmienic[i]) {
zaswiecone[i] = !zaswiecone[i];
}
}
};
bool operator<(const Plansza &p) const {
for (int i = 0; i < N*N; i++) {
if (zaswiecone[i] != p.zaswiecone[i]) {
return zaswiecone[i] < p.zaswiecone[i];
}
}
return false;
}
};
int ile_razy_przegenerowac(Plansza p, bool wypisac = false) {
int ile_razy = 0;
set<Plansza> plansze;
if(wypisac) {
p.wypisz();
printf("ile razy %d\n", ile_razy);
}
plansze.insert(p);
p.przegeneruj();
if(wypisac) {
p.wypisz();
printf("ile razy %d\n", ile_razy);
}
while(plansze.find(p) == plansze.end()) {
plansze.insert(p);
p.przegeneruj();
ile_razy++;
if(wypisac) {
p.wypisz();
printf("ile razy %d\n", ile_razy);
}
}
//printf("Ile razy: %d\n", ile_razy);
return ile_razy;
}
int najlepsza = 0;
int main() {
Plansza p;
//najlepsza = ile_razy_przegenerowac(p);
p.wypisz();
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | #include <stdio.h> #include <set> #include <random> #include <cstring> using namespace std; #define N 100 bool czy_zmienic[N*N]; class Plansza { bool zaswiecone[N*N]; public: Plansza(std::string s) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { zaswiecone[i*N+j] = s[i*N+j] == '1'; } } } Plansza() { for (int i=0;i <N; i++) { zaswiecone[i]=1; } zaswiecone[N-1]=0; for (int i = 1; i < N-1; i++) { for(int j = 0; j < N; j++) { zaswiecone[i*N+j] = j%2==0; } } for(int i = 0; i < N; i++) { zaswiecone[(N-1)*N+i] = 0; } zaswiecone[N*N-1]=1; } void wypisz() { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (zaswiecone[i*N+j]) { printf("1"); } else { printf("0"); } } printf("\n"); } } void zamien(int i, int j) { bool tmp = zaswiecone[i]; zaswiecone[i] = zaswiecone[j]; zaswiecone[j] = tmp; } void przegeneruj() { memset(czy_zmienic, 0, sizeof(bool) * N * N); for(int i = 1; i < N; i++) { for(int j = 1; j < N; j++) { if(zaswiecone[i*N+j]==zaswiecone[(i-1)*N+j-1] && zaswiecone[(i-1)*N+j]==zaswiecone[i*N+j-1] && zaswiecone[i*N+j]!=zaswiecone[(i-1)*N+j]) { czy_zmienic[i*N+j] = true; czy_zmienic[(i-1)*N+j] = true; czy_zmienic[i*N+j-1] = true; czy_zmienic[(i-1)*N+j-1] = true; } } } for(int i = 0; i < N*N; i++) { if(czy_zmienic[i]) { zaswiecone[i] = !zaswiecone[i]; } } }; bool operator<(const Plansza &p) const { for (int i = 0; i < N*N; i++) { if (zaswiecone[i] != p.zaswiecone[i]) { return zaswiecone[i] < p.zaswiecone[i]; } } return false; } }; int ile_razy_przegenerowac(Plansza p, bool wypisac = false) { int ile_razy = 0; set<Plansza> plansze; if(wypisac) { p.wypisz(); printf("ile razy %d\n", ile_razy); } plansze.insert(p); p.przegeneruj(); if(wypisac) { p.wypisz(); printf("ile razy %d\n", ile_razy); } while(plansze.find(p) == plansze.end()) { plansze.insert(p); p.przegeneruj(); ile_razy++; if(wypisac) { p.wypisz(); printf("ile razy %d\n", ile_razy); } } //printf("Ile razy: %d\n", ile_razy); return ile_razy; } int najlepsza = 0; int main() { Plansza p; //najlepsza = ile_razy_przegenerowac(p); p.wypisz(); return 0; } |
English