HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #21  
Старый 01.12.2007, 16:45
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

Алгоритм решения задачи следующий. Доска - двумерный массив 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 и выход из рекурсии (это в самом начале функции).
 
Ответить с цитированием

  #22  
Старый 02.12.2007, 02:14
ZaCo
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме:
4610226

Репутация: 1332


По умолчанию

после сообщения о тупости задачи не ожидал более тупого ответа, принимая во внимание то, что решение я привел.
 
Ответить с цитированием

  #23  
Старый 02.12.2007, 09:16
Joker-jar
Постоянный
Регистрация: 11.03.2007
Сообщений: 581
Провел на форуме:
4172659

Репутация: 646


Отправить сообщение для Joker-jar с помощью ICQ
По умолчанию

ZaCo, я говорил о тупости условия задачи. А то, что решение ты привел, эт не значит что оно единственное
 
Ответить с цитированием

  #24  
Старый 02.12.2007, 10:39
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


По умолчанию

ZaCo, перебор возможных комбинаций слонов и ладей можно реализовать в виде плагина к BruteNet
 
Ответить с цитированием

  #25  
Старый 02.12.2007, 12:08
ZaCo
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме:
4610226

Репутация: 1332


По умолчанию

2Joker-jar в смысле не единственное? ты привел, если и решение, то не той задачи. более того, твой алгоритм не решает даже проблемы связанной с твоим условием, не относящегося к этому топику.
 
Ответить с цитированием

  #26  
Старый 06.01.2008, 17:14
podkashey
Познавший АНТИЧАТ
Регистрация: 18.06.2005
Сообщений: 1,004
Провел на форуме:
2821162

Репутация: 1320


По умолчанию

Какой тред нашел случайно... Прям в шоке..
ИМХО
X*******
**yyyyyy
*y*yyyyy
*yy*yyyy
*yyy*yyy
*yyyy*yy
*yyyyy*y
*yyyyyy*
Никто никого не бьет из друг друга, хотя бы по одному есть, кто есть кто насрать. Если нельзя чтобы вообще никто никого бил, то 8 на непересекающихся линиях. Хз че такая полемика... гы. Как запрограммировать незнаю - в фотошопе или пеинте ИМХО.
П.С. Ответ-то есть какой-нибудь уже?
 
Ответить с цитированием

  #27  
Старый 06.01.2008, 17:48
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


По умолчанию

podkashey, ты всмысле пытался нарисовать *** буквами "ХУЙ", или это реально решение...? )))))
 
Ответить с цитированием

  #28  
Старый 06.01.2008, 21:12
ZaCo
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме:
4610226

Репутация: 1332


По умолчанию

в двух постах этой темы же написал, что тогда смысл у задачи теряется, точнее программистский. чем вам моя реализация-то (выводит даже !позиции! слонов и ладей) не нравится? хотя тут интересен исключительно момент оптимизации алгоритма..
 
Ответить с цитированием

  #29  
Старый 07.01.2008, 05:54
Delimiter
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..
 
Ответить с цитированием

  #30  
Старый 07.01.2008, 06:09
Delimiter
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-ти значные результаты вывалятся в файл
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачка StocKeR Болталка 1 07.10.2007 21:23
Головоломка для sql мастеров) k1b0rg Болталка 15 09.02.2007 19:25



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ