Räume zählen und gleichzeitig wissen, wo Wände sind

Diese Frage bezieht sich auf Code für C ++ Builder 6. Die Bounty ist an einem Standard-C ++ - Algorithmus interessiert, um das Problem bei einer standardisierten Eingabe zu lösen (sieheDie für mehr Informationen.

Die txt-Datei, die auch die Daten darstellt, die ich in einem Array habe:

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

Erklärung des txt:
Die Zahlen aus der txt-Datei sind eine 4-Bit-Darstellung der Wände eines Raums, wobei ein gesetztes Bit eine Wand darstellt. Die Mauerbits sind im Uhrzeigersinn angeordnet, wobei das wichtigste Bit die Westmauer ist. Zum Beispiel, 1101 steht für einen Raum, in dem:

Das gesetzte Bit in der höchstwertigen Position zeigt eine Wand nach Westen anDas gesetzte Bit an der nächsthöheren Position zeigt eine Wand nach Norden anDas nicht gesetzte Bit zeigt an, dass sich keine Mauer im Osten befindetDas gesetzte Bit in der niedrigstwertigen Position zeigt eine Wand nach Süden an

Gegeben

ie Außenwände der Zimmer haben immer eine WaInnenwände werden immer in beiden Räumen ausgedrückt (im Beispiel, da der Raum bei (1, 1) @ i 1101 Es enthält eine Wand nach Süden, der Raum bei (1, 2) 1110 muss enthalten eine Mauer nach NordenEs wird nie mehr als @ gebnumeric_limits<int>::max() Räum

I wurde gebeten, meinen Code zu posten hier ist es also
Ich habe versucht, dieses Problem zu lösen, aber ich erhalte eine EAAccessviolation. Kann mir jemand sagen, was ich falsch mache?

  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]) );
}

Antworten auf die Frage(10)

Ihre Antwort auf die Frage