Asi už jdu pozdě, ale třeba se ještě pár tipů bude hodit...
Data bych načítal po řádcích (Readln) do nk-znakového řetězce (třeba var radek:string[nk]). Ten se pak dá projít znak po znaku a podle nich nastavit prvky matice. Ale s načítáním znak po znaku to samozřejmě půjde taky, když se ošetří ty konce řádků.
S maticí by se nejlépe pracovalo ve tvaru array[1..nk,1..nk] of boolean, nastavení jednoho prvku by pak mohlo vypadat třeba takhle: matice[i,j]:=radek[j]='1' (radek[j]='1' je logický výraz, který dá hodnotu true, pokud se to rovná, a false, pokud ne). Ale zase by se to nedalo vypisovat přímo na obrazovku, musel bys ifem vybrat znak '0' nebo '1'. Z hlediska snadnosti výpisu by tedy bylo nejlepší, kdyby matice byla pole nk stringů (i s tím by se dalo pracovat).
Potom při počítání přírůstků a úbytků nezapomeň, že je potřeba mít dvě matice: jednu s aktuálním stavem, ze které čteš kde co je, a druhou s novým stavem, do které zapisuješ. Až všechno přepočítáš, zkopíruj novou matici do aktuální.
Nevím, jak je myšlena ta "podmatice, která zajistí, aby okrajové prvky byly neživé". Kdybych chtěl zabít okraje, prošel bych je dvěma cykly a nastavil na "neživý" (false nebo '0'): jeden cyklus by šel vodorovně a měnil by první a poslední řádek, druhý svisle a měnil by první a poslední sloupec. Jestli jsem to dobře pochopil, tak ti jde asi jenom o to, jak si zjednodušit počítání živých prvků poblíž okrajů matice: když přidáš okraje plné mrtvol, zbavíš se práce s kontrolou, jestli zkoumaný prvek náhodou neleží mimo matici. Pak to ale chce rozsah matice zvětšit na [0..nk+1] ("provozní" data budou jenom na pozicích 1..nk, pomocné pozice 0 a nk+1 budou pořád mrtvé).
Radši bych to ale nekomplikoval a ve výpočtech bych prostě přidal podmínku, že pokud se souřadnice nějakého zkoumaného prvku nacházejí mimo oblast matice, má se považovat za neživý. Na to by bylo ideální napsat funkci: function zije(var A:mat; n:integer; i,j:integer):boolean. Ta by nejdřív zkontrolovala souřadnice. Kdyby byly mimo, vrátí false a konec. Jinak by se podívala do matice a vrátila by true nebo false podle toho, co by tam našla.
Další možnost je, že by funkce nevracela booleany (i když by to bylo logické), ale číslo 0 nebo 1. Případně že by přímo ta matice byla složená z čísel a ne z booleanů ani z charů. Bylo by to výhodnější - protože hlavním účelem je spočítat, kolik je okolo zkoumaného prvku živých, stačilo by prostě sečíst hodnoty všech osmi okolních políček.
A jéje, zase jsem místo jednoduché rady skončil chaotickým brainstormingem :-]. No nic, snad to k něčemu bude.