Działające rozwiązanie dla punktów: 64.1 i 64.2

 

 

#include<iostream>
#include<fstream>
#include<ctime>
#include<cstdlib>
#include<algorithm>
using namespace std;
 
string T[10000];    //tablica wczytana z pliku
string T2[10000]; //tablica bez 21-j kolumny
int n;
void zad1();
void zad2();
 
main()
{
ifstream in ("dane_obrazki.txt");
 
int i=1;
while(!in.eof())
{
in>>T[i++];
}
n=i;
//kontrola wczytania danych
/*
for (int i=1 ; i<n ; i++)
{
cout<<i<<"\t"<<T[i];
cout<<endl;
}
*/
zad1();
zad2();
 
}
 
void zad1()
{
int ile,rew=0,maxB=0;
for (int i=1 ; i<n ; i+=21)
{
ile=0;
if (i%21!=0)
for (int k=i;k<i+20;k++)
for (int j=0;j<20;j++)
if (T[k][j]==49) ile++;
maxB=max(maxB,ile);
if (ile>200) rew++;
}
cout<<"odp 64.1: "<<"rew: "<<rew<<" max B:"<<maxB;
 
}
 
 
void zad2()
{
string a,b;
bool rek=true,first=true;
int ile=0,pom;
//przepisanie do nowej tablicy bez 21 kolumny
for (int i=1 ; i<n ; i++)
for (int j=0 ; j<20 ; j++)
T2[i]+=T[i][j];
//sprawdzamy co 21 linie,
for (int i=1 ; i<n ; i+=21)
{
rek=true;
if (i%21!=0)
 
//sprawdzenie lini 1 i 11, 2 i 12, 3 i 13... 10 i 20
for (int k=i ; k<i+10 ; k++) 
if (T2[k]!=T2[k+10]) {rek=false;}
 
//sprawdzenie zgodnosci kolumn 1-10 oraz 11-20 
//1-10 string->a    11-20-string->b
if(rek)
for (int k=i ; k<i+10 ; k++)
{
a="";b="";
for (int j=0 ; j<20 ; j++)
{
if (j<10) a+=char(T[k][j]); else b+=char(T[k][j]);
}
if (a!=b) {rek=false;}
}
 
//zliczanie kwadratow rekurencyjny + wyszukanie pierwszego
if  (rek) 
{
ile++; cout<<"i="<<i<<endl;
if (first) pom=i,first=false;
}
 
 
//cout<<"ile: "<<ile<<endl;
//system("pause");
 
 
}
cout<<"\nodp 64.2: "<<ile;
cout<<endl;
for (int k=pom ; k<pom+20 ; k++) cout<<pom<<" "<<T2[k]<<endl;
 
}