#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MINDIFF 2.25e-308
double sqroot(double square){ //finding root
double root=square/3, last, diff=1;
if (square <= 0) return 0;
do {
last = root;
root = (root + square / root) / 2;
diff = root - last;
} while (diff > MINDIFF || diff < -MINDIFF);
return root;
}
controlPoint(int size, int array[size][size],int row, int column){ //checking four sides of all "2"s
if(array[row-1][column]==1 && row>0){
array[row-1][column]=2;
controlPoint(size,array,row-1,column);
}
if(array[row+1][column]==1 && row<size-1){
array[row+1][column]=2;
controlPoint(size,array,row+1,column);
}
if(array[row][column-1]==1 && column>0){
array[row][column-1]=2;
controlPoint(size,array,row,column-1);
}
if(array[row][column+1]==1 && column<size-1){
array[row][column+1]=2;
controlPoint(size,array,row,column+1);
}
}
controlOnetoTwo(int size, int array[size][size], int row, int column){ //checking four sides of all assigned "1"s
if(array[row-1][column]==2 && row>0){
array[row][column]=2;
controlPoint(size,array,row,column);
}
if(array[row+1][column]==2 && row<size-1){
array[row][column]=2;
controlPoint(size,array,row,column);
}
if(array[row][column-1]==2 && column>0){
array[row][column]=2;
controlPoint(size,array,row,column);
}
if(array[row][column+1]==2 && column<size-1){
array[row][column]=2;
controlPoint(size,array,row,column);
}
}
randomAssign(int size, int array[size][size]){ //assigning "1" random row and column
int i = rand()%size;
int j = rand()%size;
if(array[i][j] == 1 || array[i][j] == 2){ // eliminating duplicate randoms
randomAssign(size,array);
} else {
if(i == 0){
array[i][j] = 2; // if assigned "1" is on first line, make it 2
controlPoint(size,array,i,j);
}
if(array[i][j] == 0){
array[i][j] = 1;
controlOnetoTwo(size,array,i,j);
}
}
}
printGrid(int size, int array[size][size]){ //print last grid
int i, j;
printf("---------------------------\n");
for(i=0;i<size;i++){
for(j=0;j<size;j++){
printf("%d", array[i][j]);
}
printf("\n");
}
printf("---------------------------\n");
}
calculations(int howmanytimes, double avgMean[howmanytimes]){ // calculate mean and stddev
int i;
double sumstddev = 0, summean = 0, averagemean = 0, stddevsquare = 0;
for(i=0;i<howmanytimes;i++){
summean += avgMean[i];
}
averagemean = summean / howmanytimes;
for(i=0;i<howmanytimes;i++){
sumstddev += (avgMean[i] - averagemean) * (avgMean[i] - averagemean);
}
stddevsquare = sumstddev / (howmanytimes - 1);
printf("mean() = %.7f\n",averagemean);
printf("stddev() = %.7f\n",(sqroot(stddevsquare)));
printf("---------------------------\n");
}
int main()
{
int size, i, j, howmanytimes, y, z, x, k;
scanf("%d",&size);
scanf("%d",&howmanytimes);
double avgMean[howmanytimes];
int array[size][size];
srand(time(NULL)); // use time for random numbers
for(k=1;k<=howmanytimes;k++){
for(i=0;i<size;i++){ // fill grid with "0"s
for(j=0;j<size;j++){
array[i][j] = 0;
}
}
double counter = 0;
int t = 1;
while(t){
for(y=0;y<size;y++){
if(array[size-1][y]==2){ // check last line for transmitting
t=0; // flag for break while loop
}
}
if(t != 0){
randomAssign(size, array);
}
}
for(x=0;x<size;x++){
for(z=0;z<size;z++){
if(array[x][z]==1 || array[x][z]==2){
counter++;
}
}
}
avgMean[k-1] = counter / (size * size);
}
printGrid(size,array);
calculations(howmanytimes, avgMean);
return 0;
}