The Game of Life

Cu un automat proiectat de Sheldon, bineînțeles că nu trece mult timp ca Leonard să-și dea seama ca produsele lui preferate costă cel mai mult. Așa că se decide să-i dea o provocare lui Sheldon pe care dacă acesta nu o va duce la capăt, va trebui sa scadă prețurile pentru automat.

L:  -Trebuie sa simulezi jocul meu preferat: The Game of Life.

S:  -Easy!! O matrice de întregi 1 și 0. Dă banii pe săptămâna trecută că termin într-o oră:)

L:  -Nu ai voie să folosești decât octeți și biții acestora reprezintă celulele de 1 și 0. Starea inițială și nr. de generații le dau eu!

S:  -Howard!! HELP!!

Cerință

Fiind dată o stare inițială(seed) prin intermediul unei matrici de octeți și un număr de generații, să se simuleze The Game of Life folosind următoarele reguli ale jocului

  • O celulă vie (1) care are mai puțin de 2 vecini vii (1), moare (devine 0).
  • O celulă vie (1) care are 2 sau 3 vecini vii (1), trăiește încă o generație(ramăne 1).
  • O celulă vie (1) care are mai mult de 3 vecini vii (1), moare(devine 0).
  • O celulă moartă (0) care are exact 3 vecinivii (1), devine vie(1).

Sunt considerați vecini toate celulele adiacente orizontal, vertical și pe diagonale. Celulele din colt au deci doar 3 vecini, iar cele de pe margine au doar 5.

La final se va afișa starea în care a ajuns ultima generație.

Precizări

Starea inițială se citește de la tastatură astfel:

  • N – numărul de coloane ale matricii
  • o matrice de (8*N) x N de tip unsigned char (valori cuprinse între 0 și 255) separate prin spațiu, obținând astfel în memorie o matrice patratică de 1 și 0.
  • G – numărul de generații simulate.

Starea inițială reprezintă generația 0 și trebuie trecută prin generațiile 1-G. Între 2 stări consecutive NU există stare intermediară: fiecare celulă trece din starea n în starea n+1 în funcție de valorile pe care cei 8 (sau mai puțini) vecini ai săi le aveau în starea n.

Starea finală se va afișa pe ecran sub forma unei matrici de (8*N)xN de tip unsigned char separate prin spațiu.

 Pentru a folosi eficient memoria programului va trebui la lucrați asupra datelor de tip unsigned char folosind operații pe biți. Astfel trebuie sa fiți atenți la modul în care identificați vecinii unei celule (bit): de exemplu într-o matrice M de 16 X 2, bitul 7 al elementului M[5][0] va avea următorii vecini:

  • bitul 6 al M[4][0]
  • bitul 7 al M[4][0]
  • bitul 0 al M[4][1]
  • bitul 6 al M[5][0]
  • bitul 0 al M[5][1]
  • bitul 6 al M[6][0]
  • bițul 7 al M[6][0]
  • bitul 0 al M[6][1]

ATENȚIE!!! Nu aveți voie să vă construiți reprezentarea matricii din memorie într-o matrice nouă declarată în program.

Deoarece unele caractere nu sunt afișabile va trebui să folosiți pentru citire și afișare formatul “%d”.

Exemple

Intrare

1 0 102 102 0 0 24 24 0 5000

Acest exemplu de intrare ne arată o matrice 8×8 cu următoarea structura, simulata pentru 5000 de generații:

........ 
.**..**. 
.**..**. 
........ 
........ 
...**... 
...**... 
........

Ieșire

0 102 102 0 0 24 24 0

Un alt exemplu este următorul:

Intrare

1 0 4 8 14 64 128 224 0 5

Ieșire

0 0 0 20 24 8 192 192

 

Autori:  Florin Pop, Vlad Șerbănescu

Data : 05.12.2011