#include <iostream>
#include <iomanip>
#include <limits.h>
#include <string.h>
#include <stdlib.h>

#define RozmiarTablicy 4
#define SzerokoscMonitora 80 // w znakach

char *PobierzNapis(char Txt[],unsigned Dlugosc)
  {
   char *Bufor=new char[Dlugosc+1];
   while(true)
     {
      cout<<Txt<<": ";
      cin.getline(Bufor,Dlugosc+1,'\n');
      // cin.gcount() - liczba znakow pobranych przez ostatni obczyt
      if(cin.gcount()>strlen(Bufor)) break; // jezeli pobrano razem z '\n'
      cin.clear(); // dla niektorych kompilatorow wiersz zbedny
      cin.ignore(INT_MAX,'\n');
      cout<<"Zbyt dlugi napis, musi byc do "<<Dlugosc<<" znakow"<<endl<<endl;
     }
   unsigned Ilosc=strlen(Bufor);
   if(Ilosc<Dlugosc)
     {
      char *tmp=new char[Ilosc+1];
      memcpy(tmp,Bufor,Ilosc+1);
      delete[] Bufor;
      Bufor=tmp;
     }
   return(Bufor);
  }

void itoa(int V, char *Bufor,unsigned base) // zapisuje V do bufora w postaci znakowej
  {
   if(base<=36)
     {
      if(!V) *(Bufor++)='0';
      else
        {
         if(V<0)
           {
            V=-V;
            *(Bufor++)='-';
           }
         char *P=Bufor;
         while(V)
           {
            int digit=V%base;
            if(digit<10) *(Bufor++)='0'+digit;
            else         *(Bufor++)='A'+digit-10;
            V/=base;
           }
         char *K=Bufor-1;
         while(P<K)
           {
            char tmp=*P; *(P++)=*K; *(K++)=tmp;
           }
        }
     }
   else *(Bufor++)='?';
   *Bufor=0;
  }

int main()
  {
   int DlugoscNapisu=((SzerokoscMonitora-1)/RozmiarTablicy)-1;
   if(DlugoscNapisu<3) cout<<"Za duzy rozmiar tablicy"<<endl<<endl;
   else
     {
      char *Tb[RozmiarTablicy][RozmiarTablicy];
      for(int y=0;y<RozmiarTablicy;++y)
        {
         for(int x=0;x<RozmiarTablicy;++x)
           {
            char Bufor[30];
            strcpy(Bufor,"T[");
            itoa(y+1,Bufor+strlen(Bufor),10);
            strcat(Bufor,",");
            itoa(x+1,Bufor+strlen(Bufor),10);
            strcat(Bufor,"]");
            Tb[y][x]=PobierzNapis(Bufor,DlugoscNapisu);
           }
        }
      for(int y=0;y<RozmiarTablicy;++y)
        {
         for(int x=0;x<RozmiarTablicy;++x)
           {
            cout<<setw(DlugoscNapisu+1);
            cout<<Tb[y][x];
           }
         cout<<endl;
        }
      char *W[RozmiarTablicy];
      for(int i=0;i<RozmiarTablicy;++i) W[i]=Tb[i][0];
      char *K[RozmiarTablicy];
      for(int i=0;i<RozmiarTablicy;++i) K[i]=Tb[0][i];
      char *Ug=Tb[0][0];
      char *Ud=Tb[0][RozmiarTablicy-1];
      for(int y=1;y<RozmiarTablicy;++y)
        {
         if((Ug)&&(strcmp(Ug,Tb[y][y]))) Ug=0;
         if((Ud)&&(strcmp(Ud,Tb[y][RozmiarTablicy-y-1]))) Ud=0;
         for(int x=0;x<RozmiarTablicy;++x)
           {
            if((K[x])&&(strcmp(K[x],Tb[y][x]))) K[x]=0;
            if((W[x])&&(strcmp(W[x],Tb[x][y]))) W[x]=0;
           }
        }
      cout<<"Nacisnij <Enter>";
      cin.ignore(INT_MAX,'\n');
      if(Ug) cout<<"Ukosna glowna zawiera jednakowe napisy"<<endl;
      if(Ud) cout<<"Ukosna dodatkowa zawiera jednakowe napisy"<<endl;
      for(int i=0;i<RozmiarTablicy;++i)
        {
         if(W[i]) cout<<"Wiersz "<<(i+1)<<" zawiera jednakowe napisy"<<endl;
         if(K[i]) cout<<"Kolumna "<<(i+1)<<" zawiera jednakowe napisy"<<endl;
        }
     }
   cout<<"Nacisnij <Enter>";
   cin.ignore(INT_MAX,'\n');
   return(0);
  }
