Contando quartos enquanto sabe onde estão as paredes

Esta pergunta está no código do construtor C ++ 6. A recompensa está interessada em um algoritmo C ++ padrão para resolver o problema, dada uma entrada padronizada (consulteesta Para maiores informações.)

O arquivo txt que também representa os dados que tenho em uma matriz:

1101 0110 1101 0110 1100 0101 0110
1110 1001 0110 1011 1010 1111 1010
1000 0101 0011 1110 1011 1110 1010
1011 1101 0101 0001 0101 0011 1011

Explicação do txt:
Os números do arquivo txt são uma representação de 4 bits das paredes de uma sala, com um bit definido representando uma parede. Os bits da parede estão no sentido horário, começando com o bit mais significativo sendo a parede oeste. Por exemplo,1101 representa uma sala onde:

O bit definido na posição mais significativa indica uma parede para o oesteO bit definido na próxima posição mais significativa indica uma parede ao norteO bit não definido indica nenhuma parede ao lesteO bit definido na posição menos significativa indica uma parede para o sul

Dado:

As paredes externas dos quartos sempre terão uma paredeAs paredes internas sempre serão expressas nos dois quartos (no exemplo, desde que o quarto em (1, 1) seja1101 contém uma parede ao sul, a sala em (1, 2)1110 deve conter uma parede ao norteNunca haverá mais do quenumeric_limits<int>::max() quartos

I foi convidado a postar meu código Então aqui está:
Eu tentei resolver isso, mas estou recebendo uma violação do EAAccess. Alguém pode me dizer o que estou fazendo de errado?

  int rn=0,z=0, global=0,coord[15],c[411],b1[411];

void peruse ( int i, int j,int* bb)
{
bool top=false,bottom=false,right=false,left=false;
//truth checks

if (bb[i*m+j]<1000)  left=true;

if (bb[i*m+j]<100)   top=true; else if (bb[i*m+j]-1000<100)   top=true;

if (bb[i*m+j]<10)    right=true; else
if ( (bb[i*m+j]-100<10) || (bb[i*m+j]-1000<10) || (bb[i*m+j]-100<10) ) right=true;

if (bb[i*m+j]<1)   bottom=true; else
if ( (bb[i*m+j]-10<1) || (bb[i*m+j]-100<1) || (bb[i*m+j]-1000<1) ||(bb[i*m+j]-100<1))
bottom=true;
//marc

if  (left)
{
c[i*m+j]=c[i*m+j]+1000; // EAaccessViolation i dont know why.....
peruse(i,j-1,c);
}
if (top)
{
c[i*m+j]=c[i*m+j]+100;
peruse(i-1,j,c);
}
if (right)
{
c[i*m+j]=c[i*m+j]+10;
peruse(i,j+1,c);
}
if (bottom)
{
c[i*m+j]=c[i*m+j]+1;
peruse(i+1,i,c);
}
 if ( !(left) && !(top) && !(right) && !(bottom) )
 {
  bb[411]++;



 }
}


void __fastcall TForm1::Button7Click(TObject *Sender)
{
b1[411]=0;

 for(int i=0;i<n;i++)
    for (int j=0;j<m;j++)
          {
           b1[i*m+j]=b[i][j];
           c[i*m+j]=b[i][j];
          }
  peruse (1,1,b1);

 ShowMessage("Nr. "+IntToStr(b1[411]) );
}

questionAnswers(5)

yourAnswerToTheQuestion