Подсчет комнат, зная, где стены
Этот вопрос относится к коду для C ++ Builder 6. Баунти заинтересован в стандартном алгоритме C ++ для решения проблемы с учетом стандартизированного ввода (см.этот для дополнительной информации.)
TXT-файл, который также представляет данные, которые я имею в массиве:
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
Объяснение текста:
Числа из txt файла представляют собой 4-битное представление стен комнаты, а установленный бит представляет стену. Стенные биты расположены по часовой стрелке, начиная с самого значительного бита, являющегося западной стеной. Например,1101 представляет комнату, где:
Дано:
Наружные стены комнат всегда будут иметь стенуВнутренние стены всегда будут выражены в обеих комнатах (в примере, так как комната в (1, 1)1101 он содержит стену на юг, комната в (1, 2)1110 должен содержать стену на северТам никогда не будет больше, чемnumeric_limits<int>::max()
номераI попросили опубликовать мой код так вот оно:
Я пытался решить эту проблему, но я получаю EAAccessviolation может кто-нибудь сказать мне, что я делаю неправильно?
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]) );
}