#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);
}

