結局、盤面は32を基数にするのは止めました 
実際に19で割るのは時間がかかりますけど
あらかじめ計算しておけば(対応表を作っておけば)済むからです
それよりも周囲を1マス多めに取っておくことが高速化、簡略化に繋がると思うので20か21マスにします
盤面の更新は盤面全体をコピーして戻すことにします なるべくコピー速度を上げる為も少ないビット数の方が良いです

あと乱数生成に時間がかかっている場合、これを使ってみて下さい 貼り付けておきます
unsigned int rnd(){
static unsigned int x=3,y=11,z=13,w=17;
unsigned int t=(x^(x<<13));
x=y; y=z; z=w;
return ( w=(w^(w>>7))^(t^(t>>5)) ); }

void srnd(unsigned int n){
for(unsigned int i=0;i<=1000+(n&0xFFFF);i++)rnd();}