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

> Новый Морской бой
bLACK_wINGS
сообщение 8.10.2006 22:16
Сообщение #1





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

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


В общем.. ига такая на логику... Весь инет облазил в поисках инфы, ничего не нашел.. попалась случайно вместе с журнальчиком 777. Суть игры:
Дано поле. По вертикали и горизонтали расположены числа 0..9. Каждое число предполагает наличие в в линии такого количества фрагментов кораблей. Набор кораблей стандартный. В общем прожка по идее должна выдать расстановку кораблей. Ваши соображения по поводу)))) smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
bLACK_wINGS
сообщение 2.11.2006 22:18
Сообщение #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 - 2.11.2006 22:33
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 



- Текстовая версия 15.07.2025 1:52
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"