#include <iostream>
#include <iomanip>
#include <math.h>

using namespace std;

enum feldfarbe {weiss, schwarz};

struct einzelfeld
{
	feldfarbe farbe;
	bool checked;
};

class zahlenfeld
{
	private:
		int n;
		einzelfeld** ezfeld;
		int clustergr;
		int calculateClusterSize(int startx, int starty);
	public:
		einzelfeld getEinzelFeld(int x, int y);
		int getClustergr();
		zahlenfeld(int n, float p);
};


einzelfeld zahlenfeld::getEinzelFeld(int x, int y)
{
	if(x < n && x>=0 && y >= 0 && y < n)
	{	
		return(ezfeld[x][y]);
	}else
	{
		cerr << "Ungueltige Dimensionen angefordert\n";
		exit(1);
	}
}

int zahlenfeld::getClustergr()
{
	return(clustergr);
}

zahlenfeld::zahlenfeld(int size, float p)
{
	srand((unsigned int)time(0));
	float zufallszahl = 0;
	
	// Setzen von Clustergroesse breite und hoehe
	n = size;
	
	// Initialisieren des Feldes
	
	ezfeld = new einzelfeld*[n];
	for(int i=0;i<n;i++)
	{
		ezfeld[i] = new einzelfeld[n];
		for(int j = 0;j < n;j++)
		{
			zufallszahl = rand()/(float)RAND_MAX;
			if(zufallszahl <= p)
			{
				ezfeld[i][j].farbe = schwarz;
			}
			else
			{
				ezfeld[i][j].farbe = weiss;
			}
			ezfeld[i][j].checked = false;
		}
	}
	clustergr = calculateClusterSize(n / 2,n / 2);
}

int zahlenfeld::calculateClusterSize(int startx, int starty)
{
	if(ezfeld[startx][starty].farbe == weiss) return(0);
	int temp = 1;
	ezfeld[startx][starty].checked = true;
	// Links
	if(startx > 0 && !ezfeld[startx -1][starty].checked && ezfeld[startx -1][starty].farbe == schwarz) temp += calculateClusterSize(startx -1, starty);
	// Rechts
	if(startx < n -1 && !ezfeld[startx +1 ][starty].checked && ezfeld[startx +1][starty].farbe == schwarz) temp += calculateClusterSize(startx +1, starty);
	// Oben
	if(starty > 0 && !ezfeld[startx][starty - 1].checked && ezfeld[startx][starty -1].farbe == schwarz) temp += calculateClusterSize(startx, starty - 1);
	// Unten
	if(starty < n-1 && !ezfeld[startx][starty + 1].checked && ezfeld[startx][starty + 1].farbe == schwarz) temp += calculateClusterSize(startx, starty + 1);
	return(temp);
}

int main()
{
	int n = 51;
	float p;
	cout << "Bitte den Wert fier p angeben: ";
	cin >> p;
	zahlenfeld feld(n,p);
	cout << "Hier kommt das Feld mit einer Clustergroesse von " <<  feld.getClustergr() << ":\n";
	for(int i=0;i<n;i++)
	{
		for(int j = 0;j < n;j++)
		{
			if(feld.getEinzelFeld(i,j).farbe == weiss)
			{
				cout << " ";
			}else
			{
				if(feld.getEinzelFeld(i,j).checked)
				{
					cout << "#";
				}else
				{
					cout << "+";
				}
			}
		}
		cout << endl;
	}
	return(0);
}
