ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

01.12.2007, 16:45
|
|
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме: 4172659
Репутация:
646
|
|
Алгоритм решения задачи следующий. Доска - двумерный массив 8x8 байтов. Определяемся, например, так: 0 - клетка пуста, 1 - клетка занята слоном, 2 - клетка занята ладьей, 3 - клетка под боем слона, 4 - клетка под боем ладьи, 5 - клетка под боем обоих фигур. Далем две функции с входными параметрами - (доска, i, j), возвращающие также доску. Первая ставит на доску в клетку [i,j] слона а также забивает все клетки, в которые может срубить слон соотв. значениями (3, а если значение 2 - ладья бьет, то 5). Вторая делает то же самое, но для ладьи. Создается глобальная переменная, что-то вроде BestCount, в которую будет заноситься ответ. Теперь с рекурсией. Ее входные параметры: экземпляр доски, номер строки доски и count. В рекурсии идет цикл от 1 до 8 (идем по текущей строке доски). Если значение клетки = 0 (пусто) или 3 (под боем слона), то вызываем функцию вставки слона в эту клетку и вызываем рекрсию с параметрами: получившаяся доска, номер строки + 1, count + 1. Если значение клетки = 0 (пусто) или 2 (под боем ладьи), то вызываем функцию вставки ладьи в эту клетку и вызываем рекрсию с параметрами: получившаяся доска, номер строки + 1, count + 1. Вызов рекурсии происходит в цикле, без break'а. Если номер строки > 8 то если count > BestCount то BestCount := count и выход из рекурсии (это в самом начале функции).
|
|
|

02.12.2007, 02:14
|
|
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме: 4610226
Репутация:
1332
|
|
после сообщения о тупости задачи не ожидал более тупого ответа, принимая во внимание то, что решение я привел.
|
|
|

02.12.2007, 09:16
|
|
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме: 4172659
Репутация:
646
|
|
ZaCo, я говорил о тупости условия задачи. А то, что решение ты привел, эт не значит что оно единственное
|
|
|

02.12.2007, 10:39
|
|
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме: 1941233
Репутация:
2726
|
|
ZaCo, перебор возможных комбинаций слонов и ладей можно реализовать в виде плагина к BruteNet 
|
|
|

02.12.2007, 12:08
|
|
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме: 4610226
Репутация:
1332
|
|
2Joker-jar в смысле не единственное? ты привел, если и решение, то не той задачи. более того, твой алгоритм не решает даже проблемы связанной с твоим условием, не относящегося к этому топику.
|
|
|

06.01.2008, 17:14
|
|
Познавший АНТИЧАТ
Регистрация: 18.06.2005
Сообщений: 1,004
Провел на форуме: 2821162
Репутация:
1320
|
|
Какой тред нашел случайно... Прям в шоке..
ИМХО
X*******
**yyyyyy
*y*yyyyy
*yy*yyyy
*yyy*yyy
*yyyy*yy
*yyyyy*y
*yyyyyy*
Никто никого не бьет из друг друга, хотя бы по одному есть, кто есть кто насрать. Если нельзя чтобы вообще никто никого бил, то 8 на непересекающихся линиях. Хз че такая полемика... гы. Как запрограммировать незнаю - в фотошопе или пеинте ИМХО.
П.С. Ответ-то есть какой-нибудь уже?
|
|
|

06.01.2008, 17:48
|
|
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме: 1941233
Репутация:
2726
|
|
podkashey, ты всмысле пытался нарисовать *** буквами "ХУЙ", или это реально решение...? )))))
|
|
|

06.01.2008, 21:12
|
|
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме: 4610226
Репутация:
1332
|
|
в двух постах этой темы же написал, что тогда смысл у задачи теряется, точнее программистский. чем вам моя реализация-то (выводит даже !позиции! слонов и ладей) не нравится?  хотя тут интересен исключительно момент оптимизации алгоритма..
|
|
|

07.01.2008, 05:54
|
|
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме: 2187381
Репутация:
518
|
|
От балды или фонаря наваял.... вдруг кто то посмотрит
char A[8][8];
CFile f;
CFileException e;
int step(int x,int y,int cnt)
{
int r1,r2,rm,i,j,k,l,e;
int ti,tj;
int vy1,vy2; //virtualnie koordinati
rm=cnt;
r2=r1=0;
for(i=x;i<8;i++)
{
for(j=y;j<8;j++)
{
if(A[i][j]==0)
{
// pitaemsia postavit ladiu
for(k=0,e=0;k<8 && e==0;k++)
{
if(A[i][k]>40 && k!=j)
e=1;
if(A[k][j]>40 && k!=i)
e=1;
}
if(e==0) // net figur pod boem
{
// stavim ladiu
A[i][j]='L';
// uvelichivaem schetchiki bitia
for(k=0;k<8;k++)
{
if(A[i][k]!='L')
A[i][k]++;
if(A[k][j]!='L')
A[k][j]++;
}
ti=i;tj=j;
r1=step(ti,tj,cnt+1); //uhodim v glubinu v 1-u diru
// vozvraschaem schetchiki
for(k=0;k<8;k++)
{
if(A[i][k]!='L')
A[i][k]--;
if(A[k][j]!='L')
A[k][j]--;
}
A[i][j]=0; // vozvraschaem kletke pervonachalnoe
}
// pitaemsia postavit slona
// virtualnie koordinati
vy1=i-j;
vy2=j+i;
for(k=0,e=0;k<8 && e==0;k++)
{
if(k!=j)
{
if(vy1+k>=0 && vy1+k<8)
{ // esli ne za ramkami
if(A[vy1+k][k]>40)
e=1;
}
if(vy2-k>=0 && vy2-k<8)
{
if(A[vy2-k][k]>40)
e=1;
}
}
}
if(e==0) // net figur pod boem
{
A[i][j]='S'; // stavim slona
//uvelichivaem schetchiki
for(k=0;k<8;k++)
{
if(k!=j)
{
if(vy1+k>=0 && vy1+k<8)
{
A[vy1+k][k]++;
}
if(vy2-k>=0 && vy2-k<8)
{
A[vy2-k][k]++;
}
}
}
ti=i;tj=j;
r2=step(ti,tj,cnt+1); //uhodim v glubinu vo 2-u diru
//umenshaem schetchiki
for(k=0;k<8;k++)
{
if(k!=j)
{
if(vy1+k>=0 && vy1+k<8)
{
A[vy1+k][k]--;
}
if(vy2-k>=0 && vy2-k<8)
{
A[vy2-k][k]--;
}
}
}
A[i][j]=0; // vozvraschaem kletke pervonachalnoe
}
if(r2>r1 && rm<r2)
rm=r2;
else
if(r1>r2 && rm<r1)
rm=r1;
}
}
y=0;
}
return rm;
}
void CZadach1Dlg::OnStart()
{
// TODO: Add your control notification handler code here
int i,j;
if(f.Open("c:\\rez.txt",CFile::modeCreate | CFile::modeWrite,&e))
f.Close();
for(i=0;i<8;i++)
for(j=0;j<8;j++)
A[i][j]=0;
m_rez=i=step(0,0,0);
UpdateData(false);
}
Последний раз редактировалось Delimiter; 07.01.2008 в 06:07..
|
|
|

07.01.2008, 06:09
|
|
Banned
Регистрация: 08.04.2005
Сообщений: 446
Провел на форуме: 2187381
Репутация:
518
|
|
а если перед return rm вставить
// -------------- kusok dlia togo chtob glianut chto tam za rezultaty
if(rm==cnt)
{
if(cnt==14)
{
//vivod v file rezultatov predvaritelno poluchiv 14 kak rezultat
if(f.Open("c:\\rez.txt",CFile::modeWrite,(CFileExc eption *)&e))
{
f.SeekToEnd();
for(i=0;i<8;i++)
{
f.Write("*---*---*---*---*---*---*---*---*\r\n|",36);
for(j=0;j<8;j++)
{
f.Write(" ",1);
if(A[i][j]>40)
{
f.Write((char *)&(A[i][j]),1);
}
else
{
f.Write(" ",1);
}
f.Write(" |",2);
}
f.Write("\r\n",2);
}
f.Write("*---*---*---*---*---*---*---*---*\r\n",35);
f.Close();
}
}
}
то все 14-ти значные результаты вывалятся в файл
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|