IPB
ЛогинПароль:

> Новый Морской бой
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


В общем.. ига такая на логику... Весь инет облазил в поисках инфы, ничего не нашел.. попалась случайно вместе с журнальчиком 777. Суть игры:
Дано поле. По вертикали и горизонтали расположены числа 0..9. Каждое число предполагает наличие в в линии такого количества фрагментов кораблей. Набор кораблей стандартный. В общем прожка по идее должна выдать расстановку кораблей. Ваши соображения по поводу)))) smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


В принципе с твоей функцией понятно. Однако у меня она будет работать немного по другому.
1. Получаем максимальнок кол-во фрагментов в линии
2. Получаем массив из 0 и 1 для порождения перестановок, где сумма 1=кол-во фрагментов на шаге 1
3. Записываем его в строку поля
4. Убираем эту линию, что бы не использовать на последующих шагах
5. Вызов рекурсии
Специально не включил проверку на законченность поля, что бы убедится что стека хватит. Выдает сообщение о переполнении стека wink.gif
Код
Код

const n=10;
type t_mas=array[0..n] of 0..1;
     type t_matr=array[0..n] of t_mas;
function pr(const q:t_mas;s:byte):boolean; //проверка, что кол-во единиц и кол-во фрагментов совпадает
var i:byte;
    k:byte;
begin
  k:=0;
  for i:=1 to n do k:=k+q[i];
  if k=s then pr:=true
  else pr:=false;
end;
function findmaxfrag(const a:t_matr):byte; //находим-макс. фрагментов из линии
var i,max:byte;
begin
  max:=0;
  for i:=0 to n-1 do
    if a[i,n] > max then max:=i;
  for i:=0 to n-1 do if a[n,i]>max then
    max:=i+n;
  findmaxfrag:=max;
end;

var a:t_matr;
    j,i:byte;
    q1:boolean;
function rekurs:byte; //сама рекурсия
var i,j,t:-1 ..n;
    r:1..n;
    h,coun,l,z:byte;
    s:array[0..n] of 1..n;
    q:t_mas;
begin
t:=0;
h:=findmaxfrag(a);
if h-10 >0 then
begin
for j:=n downto 1 do
  begin
    q[j]:=0;
    t:=t+1;
    s[t]:=j;
  end;
  while t>=0 do
  begin
    if pr(q,a[n,h-10]) then
    begin
      for l:=0 to n-1 do a[l,h-10]:=q[l+1];
      a[n,h-10]:=0;
      z:=rekurs;
    end;
    i:=s[t];
    t:=t-1;
    q[i]:=1 xor q[i];
    for j:=i-1 downto 1 do
    begin
      t:=t+1;
      s[t]:=j;
    end;
  end
end
else
  begin
  for j:=n downto 1 do
  begin
    q[j]:=0;
    t:=t+1;
    s[t]:=j;
  end;
  while t>=0 do
  begin
    q1:=pr(q,a[n,h]);
    if pr(q,a[n,h]) then
    begin
      for l:=0 to n-1 do a[h,l]:=q[l+1];
      a[h,n]:=0;
      z:=rekurs;
    end;
    i:=s[t];
    t:=t-1;
    q[i]:=1 xor q[i];
    for j:=i-1 downto 1 do
    begin
      t:=t+1;
      s[t]:=j;
    end;
  end
  end;
end;
begin
  for i:=0 to n do
    for j:=0 to n do
      a[i,j]:=0;
  for j:=0 to n-1 do a[n,j]:=STRTOINT(Form1.StringGrid1.Cells[1,j+1]);
  for j:=0 to n-1 do a[j,n]:=STRTOINT(Form1.StringGrid1.Cells[j+1,1]);
  rekurs;
end;

Дело даже не в передаче параметров. Просто на нижнем уровне стек переполняется.
Стек самого проца.
Да и переполнения на 2 шаге при пошаговом просмотре!!!

Сообщение отредактировано: bLACK_wINGS -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Цитата
2. Получаем массив из 0 и 1 для порождения перестановок, где сумма 1=кол-во фрагментов на шаге 1


Во-первых, делаешь ты это как-то запутанно. Если хочешь, чтобы я читал, постарайся комментировать подробно. Хотя бы сами переменные что значат. Во-вторых, я не вижу, где ты учитываешь уже полученную ситуацию на поле при генерации текущей строки. Ты ее каждый раз генеришь с нуля. Или нет?


Цитата
Дело даже не в передаче параметров. Просто на нижнем уровне стек переполняется.
Стек самого проца.
Да и переполнения на 2 шаге при пошаговом просмотре!!!


Выложи проект, я ж не буду StringGridы рисовать smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
bLACK_wINGS   Новый Морской бой   9.10.2006 2:16
Bokul   А по форуму поискать? морской бой (растановка кора…   9.10.2006 2:25
bLACK_wINGS   2Bokul: Нее.. это я уже смотрел... там чисто генер…   9.10.2006 2:32
Bokul   Да не то. Это я сначала не правильно задание по…   9.10.2006 2:41
bLACK_wINGS   2Bokul: Да набор такой: 4-однопалубников 3-двухпал…   9.10.2006 2:47
Bokul   Еще одно: Какой размер доски и может ли повторятся…   9.10.2006 3:03
Michael_Rybak   Я бы попробовал такой перебор. Рассмотрим пустую …   9.10.2006 4:46
bLACK_wINGS   2Michael_Rybak Ё-моё.. а не будет ли много мороки …   14.10.2006 2:15
Michael_Rybak   Давай :) EDIT: >Ё-моё.. а не будет ли много мо…   14.10.2006 3:01
bLACK_wINGS   Вот отсканенный типа алгоритм... Но как программу…   28.10.2006 14:42
Michael_Rybak   этот алгоритм вродь как лучше чем перебор Как с…   28.10.2006 17:13
bLACK_wINGS   2Michael_Rybak Да решал я эти головоломки, ну алго…   1.11.2006 0:30
Michael_Rybak   Вот оно как? Ну и замечательно! Что именн…   1.11.2006 0:43
bLACK_wINGS   Вот поразмыслил я над твоим предложением перебором…   2.11.2006 23:34
Michael_Rybak   Глубины более чем достаточно, потому что 1) глуб…   3.11.2006 1:08
bLACK_wINGS   В принципе с твоей функцией понятно. Однако у меня…   3.11.2006 2:18
Michael_Rybak   Во-первых, делаешь ты это как-то запутанно. Если…   3.11.2006 3:00
bLACK_wINGS   ВСЁЁЁ :rolleyes: :rolleyes: Дописал... Всего то …   12.11.2006 21:06


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.05.2024 6:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name