| Автор |
Як порахувати кількість всеможливих комбінацій одно- і двопалубних кораблів для комірки (елемента ма |
someone
Користувач
Повідомлень: 2
Зареєстрований: 03.06.11 |
| Опубліковано 03-06-2011 09:55 |
|
|
Є масив 4х4
Треба порахувати кількість всеможливих комбінацій одно- і двопалубних кораблів які можуть на ній існувати
P.S: Для даного масиву я порахував вручну:

але мені потрібен алгоритм, адже якихось клітинок може не існувати
Дякую! |
|
| Автор |
RE: Як порахувати кількість всеможливих комбінацій одно- і двопалубних кораблів для комірки (елемент |
Anastasko
Користувач

Повідомлень: 33
Звідки: ЛНУ ім. Івана Франка
Зареєстрований: 06.02.11 |
| Опубліковано 03-06-2011 11:51 |
|
|
А що означають цифри в клітинках на тому малюнку?
Feel Good |
|
| Автор |
RE: Як порахувати кількість всеможливих комбінацій одно- і двопалубних кораблів для комірки (елемент |
cupidon4uk
Користувач
Повідомлень: 393
Звідки: LNU
Зареєстрований: 02.01.09 |
| Опубліковано 03-06-2011 14:28 |
|
|
Я так зрозумів, що в клітинці число - кількість способів "заповнити" клітинку, тобто 3 - коли ми можемо покласти 2-ох палубний вертикально(це вже 1) + горизонтально(+1) і просто одиничний(+1). І того - 3. А 5 - можемо вертикально покласти 2-ма способами, і горизонтально.
Але щодо завдання. Я не дуже розумію самого питання?
І... Ті складні обрахунки, які ти зробив ( про малюнок ) здається, тобі ніяк не допоможуть, бо та табличка завжди матиме вигляд :
3 4 4 4 .... 4 4 4 3
4 5 5 5 .... 5 5 5 4
4 5 5 5 .... 5 5 5 4
. . . . .... . . . . .
. . . . .... . . . . .
. . . . .... . . . . .
4 5 5 5 .... 5 5 5 4
4 5 5 5 .... 5 5 5 4
3 4 4 4 .... 4 4 4 3
|
|
| Автор |
RE: Як порахувати кількість всеможливих комбінацій одно- і двопалубних кораблів для комірки (елемент |
someone
Користувач
Повідомлень: 2
Зареєстрований: 03.06.11 |
| Опубліковано 03-06-2011 15:55 |
|
|
CUPIDON - так, ти зрозумів правильно.
Я трохи спростив - навправді я роблю поле 10х10 і там будуть всі кораблі до чотирьохпалубних (а то трохи є мороки)...
Ось так виглядає початковий масив всеможливих варіантів для нього:

а оскільки якихось клітинок може не існувати, то треба алгоритм... ось такий я написав:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
sprava=0;
zliva=0;
nuz=0;
verx=0;
syma_vsix=syma_vsix1;
syma_vsix1=0;
for (i=0;i<10;i++)
for (j=0;j<10;j++)
{
if (StringGrid3->Cells[i][j]!="X"&&StringGrid3->Cells[i][j]!=0)
{
StringGrid3->Cells[i][j]=1;
if (i>=1)
if (StringGrid3->Cells[i-1][j]!="X"&&StringGrid3->Cells[i-1][j]!=0)
{
zliva++;
if (i>=2)
if (StringGrid3->Cells[i-2][j]!="X"&&StringGrid3->Cells[i-2][j]!=0)
{
zliva++;
if (i>=3)
if (StringGrid3->Cells[i-3][j]!="X"&&StringGrid3->Cells[i-3][j]!=0)
zliva++;
}
}
if (i<=8)
if (StringGrid3->Cells[i+1][j]!="X"&&StringGrid3->Cells[i+1][j]!=0)
{
sprava++;
if (i<=7)
if (StringGrid3->Cells[i+2][j]!="X"&&StringGrid3->Cells[i+2][j]!=0)
{
sprava++;
if (i<=6)
if (StringGrid3->Cells[i+3][j]!="X"&&StringGrid3->Cells[i+3][j]!=0)
sprava++;
}
}
if (j>=1)
if (StringGrid3->Cells[i][j-1]!="X"&&StringGrid3->Cells[i][j-1]!=0)
{
verx++;
if (j>=2)
if (StringGrid3->Cells[i][j-2]!="X"&&StringGrid3->Cells[i][j-2]!=0)
{
verx++;
if (j>=3)
if (StringGrid3->Cells[i][j-3]!="X"&&StringGrid3->Cells[i][j-3]!=0)
verx++;
}
}
if (j<=8)
if (StringGrid3->Cells[i][j+1]!="X"&&StringGrid3->Cells[i][j+1]!=0)
{
nuz++;
if (j<=7)
if (StringGrid3->Cells[i][j+2]!="X"&&StringGrid3->Cells[i][j+2]!=0)
{
nuz++;
if (j<=6)
if (StringGrid3->Cells[i][j+3]!="X"&&StringGrid3->Cells[i][j+3]!=0)
nuz++;
}
}
}
switch (nuz+verx)
{
case 6: StringGrid3->Cells[i][j]=StrToInt(StringGrid3->Cells[i][j])+9; break;
case 5: StringGrid3->Cells[i][j]=StrToInt(StringGrid3->Cells[i][j])+8; break;
case 4: StringGrid3->Cells[i][j]=StrToInt(StringGrid3->Cells[i][j])+6; break;
case 3: StringGrid3->Cells[i][j]=StrToInt(StringGrid3->Cells[i][j])+3; break;
case 2: StringGrid3->Cells[i][j]=StrToInt(StringGrid3->Cells[i][j])+2; break;
case 1: StringGrid3->Cells[i][j]=StrToInt(StringGrid3->Cells[i][j])+2; break;
}
switch (sprava+zliva)
{
case 6: StringGrid3->Cells[i][j]=StrToInt(StringGrid3->Cells[i][j])+9; break;
case 5: StringGrid3->Cells[i][j]=StrToInt(StringGrid3->Cells[i][j])+8; break;
case 4: StringGrid3->Cells[i][j]=StrToInt(StringGrid3->Cells[i][j])+6; break;
case 3: StringGrid3->Cells[i][j]=StrToInt(StringGrid3->Cells[i][j])+3; break;
case 2: StringGrid3->Cells[i][j]=StrToInt(StringGrid3->Cells[i][j])+2; break;
case 1: StringGrid3->Cells[i][j]=StrToInt(StringGrid3->Cells[i][j])+1; break;
}
syma_vsix1+=StrToInt(StringGrid3->Cells[i][j]);
a[i][j]=ceil((2000*StrToInt(StringGrid3->Cells[i][j]))/syma_vsix);
StringGrid3->Cells[i][j]=IntToStr(a[i][j]);
sprava=0;
zliva=0;
nuz=0;
verx=0;
}
}
Тож питання вичерпане і тему можна закривати.
Дякую небайдужим!
Змінив(ла) someone, 03-06-2011 15:55 |
|