import java.util.*;
import java.io.*;

public class jeu_vie
{
    static Vector v=new Vector();
    
    static grille g=new grille();
    
    public static void main(String argv[]){
	char ch;
	g.afficherGrille();
	//System.out.println("taille vecteur:"+v.size());
	while(true)
	    {
		try
		    {
			ch =(char)System.in.read();
		    }
		catch(IOException io)
		    {
			System.out.println("IO Exception caught: " + io);
		    }
		tourSuivant();
		g.afficherGrille();
	    }
    }
    
    public static void tourSuivant(){
	int j;
	int size=v.size();
	animal ani;
	System.out.println("tour suivant");
	for(j=0;j<size;j++)
	    {
		ani=(animal) v.elementAt(j);
		if(!ani.vivre())
		    {
			//			System.out.println("Y en a un qui creve:\nx="+ani.x+"y="+ani.y+"\nsize="+size+"j="+j);
			v.removeElementAt(j);
			j--;
			size--;
		    }
	    }
    }
}





class grille{
    int[][] tab=new int[12][12];
    //int[][] age=new int[12][12];
    
    public grille()
    {
	int i,j;
	for(i=1;i<11;i++)
	for(j=1;j<11;j++)
	    {
		if (Math.random()>0.70)
		    creation(i,j,(int)(3*Math.random()+1));
		else tab[i][j]=0;
		//age[i][j]=0;
	    }
	

	for (i=0;i<12;i++)
	    {
		tab[i][0]=-1;
		tab[0][i]=-1;
		tab[i][11]=-1;
		tab[11][i]=-1;
		/*age[i][0]=-1;
		  age[0][i]=-1;
		  age[i][11]=-1;
		age[11][i]=-1;*/
	}
	
    }

    public  void repro(int x,int y,int grp)
    {

	//System.out.println("debut repro");
	//System.out.println("x="+x+"y="+y+"grp="+grp);
	int a=x+(int)(2*Math.random())-1;
	int b=y+(int)(2*Math.random())-1;
	//System.out.println("a="+a+"b="+b);
	
	/*Ici ca plante...On doit faire une fonction qui choisit un emplacement au hazard, mais qui se souvient des trucs
	  precedents aussi etc....Et faire gaffe qu'il y a une possibilite de placement :p */
	if (placeLibre(x,y)!=0)
	    {
		while(tab[a][b]!=0)
		    {
			//System.out.println("debut boucle");
			a=x+(int)(3*Math.random())-1;
			b=y+(int)(3*Math.random())-1;
			//if ((a==0)||(a==11)||(b==0)||(b==11)) 
			//  {
			//System.out.println("merde on est la...");
			//a=x;
			//b=y;
			//  }
			//System.out.println("fin boucle a= "+a+"b="+b+"tab[a][b]="+tab[a][b]);
		    }
		
		//System.out.println("on lance creation");
		if ((a==0)||(a==11)||(b==0)||(b==11)) 	    
		    System.out.println("merde on est la...");
		creation(a,b,grp);
	    }
    }

    public  int creation(int x,int y,int grp)
    {
	//System.out.println("debut creation, grp= "+grp);
	if  (grp==1) new groupe1(x,y);
	if  (grp==2) new groupe2(x,y);
	if  (grp==3) new groupe3(x,y);
	//System.out.println("fin creation");
	tab[x][y]=grp;
	return grp;
    }
    
    public  void afficherGrille() {
	int i,j;
	for(i=1;i<11;i++)
	    {
		for(j=1;j<11;j++)
		    System.out.print(tab[i][j]);
		/*System.out.print("     AGES(debug)     ");
		  for(j=1;j<11;j++)
		  System.out.print(age[i][j]);*/
		System.out.println();
	    }
    }
    
    public  int nbVoisins(int x,int y)
    {
	//System.out.print("nbVoisins=");
	int i,j,nb=0;
	for(i=x-1;i<=x+1;i++)
	    for(j=y-1;j<=y+1;j++)
		if (tab[i][j]>0) nb++;
	//System.out.println(""+(nb-1));
	return nb-1;
    }
    
    public  int placeLibre(int x, int y)
    {
	int i,j,nb=0;
	for(i=x-1;i<=x+1;i++)
	    for(j=y-1;j<=y+1;j++)
		if (tab[i][j]==0) nb++;
	return nb;
    }
}

class animal{
    protected int age,groupe,x,y;
    public animal(int grp,int cx,int cy)
    {
	//System.out.println("Creation animal");
	groupe=grp;
	x=cx;
	y=cy;
	age=0;
	jeu_vie.v.add(this);
    }
    public boolean vivre()
    {
	//System.out.println("Hum dommage");
	return false;
    }
}

class groupe1 extends animal{
    public groupe1(int cx,int cy){
	super(1,cx,cy);
    }
    
    public boolean vivre()
    {
	//System.out.println("Chuis la 1");
	age++;
	//jeu_vie.g.age[x][y]=age;
	if(age>3) {jeu_vie.g.tab[x][y]=0;/*jeu_vie.g.age[x][y]=0;*/return false;}
	if (jeu_vie.g.nbVoisins(x,y)>1) jeu_vie.g.repro(x,y,1);
	jeu_vie.g.tab[x][y]=groupe;
	return true;
    }
}

class groupe2 extends animal{
    public groupe2(int cx,int cy){
	super(2,cx,cy);
    }
    public boolean vivre()
    {
	//System.out.println("Chuis la 2");
	age++;
	//jeu_vie.g.age[x][y]=age;
	if(age>7) {jeu_vie.g.tab[x][y]=0;/*jeu_vie.g.age[x][y]=0;*/return false;}
	if (jeu_vie.g.nbVoisins(x,y)==0) {jeu_vie.g.tab[x][y]=0;/*jeu_vie.g.age[x][y]=0;*/return false;}
	if (jeu_vie.g.nbVoisins(x,y)<6) jeu_vie.g.repro(x,y,2);
	jeu_vie.g.tab[x][y]=groupe;
	return true;
    }
}

class groupe3 extends animal{
    public groupe3(int cx,int cy){
	super(3,cx,cy);
    }
    
    public boolean vivre()
    {
	//System.out.println("Chuis la 3");
	age++;
	//jeu_vie.g.age[x][y]=age;
	if(age>10) {jeu_vie.g.tab[x][y]=0;/*jeu_vie.g.age[x][y]=0*/;return false;}
	if (jeu_vie.g.nbVoisins(x,y)==2 || jeu_vie.g.nbVoisins(x,y)==3) jeu_vie.g.repro(x,y,3);
	if (jeu_vie.g.nbVoisins(x,y)==0) {jeu_vie.g.tab[x][y]=0;/*jeu_vie.g.age[x][y]=0;*/return false;}
	if (jeu_vie.g.nbVoisins(x,y)>5) {jeu_vie.g.tab[x][y]=0;/*jeu_vie.g.age[x][y]=0;*/return false;}
	//jeu_vie.g.tab[x][y]=groupe;
	return true;
    }
}

