Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2011, 11:04   #1
ubun
Форумчанин
 
Аватар для ubun
 
Регистрация: 06.12.2010
Сообщений: 198
По умолчанию задача змейка

Не могу решить подскажите пожалуйста

Числовая «змейка»

Бесконечная таблица заполнена подряд идущими целыми положительными числами, начиная с левого верхнего угла по принципу «змейки», как показано:
1 2 9 10
4 3 8 11
5 6 7 12
16 15 14 13
17 18 ...

Например, число 12 в этой таблице находится в 3-ей строке и 4-ом столбце, а число 14 — в 4-ой строке и 3-ем столбце.

Вам нужно вычислить число, находящееся в позиции, заданной номерами её строки и столбца.

Формат входного файла input.txt

В единственной строке файла записаны два разделенных пробелом целых положительных числа X и У (1 <Х, У< 1000) — номера строки и столбца заданной позиции.

Формат выходного файла output.txt

Выходной файл содержит единственное число — число, находящееся в заданной позиции таблицы.
Пример input.txt
4 3

Пример output.txt
14
ubun вне форума Ответить с цитированием
Старый 30.11.2011, 20:40   #2
ubun
Форумчанин
 
Аватар для ubun
 
Регистрация: 06.12.2010
Сообщений: 198
По умолчанию

1 2 9 10
4 3 8 11
5 6 7 12
16 15 14 13
17 18 ...
ubun вне форума Ответить с цитированием
Старый 01.12.2011, 07:48   #3
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

Логика не сложная:
1) Довольно просто посчитать элементы главной диагонали:
1 1+2 1+2+4 1+2+4+6 итд
2) Так же можно проанализировать несколько случаев:
а) Если номер строки>номера столбца (ниже диагонали):
а1) Если номер строки четный, то находим элемент главной диагонали в этой строке и прибавляем к нему разницу в индексах между номером стобца текущего элемента и элемента диагонали
а2) Если номер строки нечетный, то то же самое, только не прибавлять разницу индексов, а вычитать
б) Если номер строки<номера столбца (над диагональю):
б1) Если номер столбца четный, то находим элемент главной диагонали в этом столбце и вычитаем разницу индексов по номеру строк
б2) Если номер столбца нечетный, то аналогично, только прибавить
в) Если номер строки=номеру столбца (на диагонали) то мы знаем как его найти (формула наверху)
Сейчас попробую воплотить это в код
благодарность - сюда (не забываем писать от кого)

Последний раз редактировалось Zer0; 01.12.2011 в 08:05.
Zer0 вне форума Ответить с цитированием
Старый 01.12.2011, 08:05   #4
Zer0
Форумчанин
 
Аватар для Zer0
 
Регистрация: 13.12.2007
Сообщений: 788
По умолчанию

Код:
var row,col:integer; r:longint;

function GetDiagElem(n:integer):integer;
var s,i:longint;
begin
  s:=1;
  for i:=1 to n-1 do
   s:=s+i*2;
  GetDiagElem:=s;
end;

begin
   read(row,col);
   if row=col then
    r:=GetDiagElem(row)
   else if row>col then begin
    if (row mod 2)=0 then r:=GetDiagElem(row)+(row-col)
    else r:=GetDiagElem(row)-(row-col);
   end else begin
    if (col mod 2)=0 then r:=GetDiagElem(col)-(col-row)
    else r:=GetDiagElem(col)+(col-row);
   end;
   writeln(r);
end.
благодарность - сюда (не забываем писать от кого)
Zer0 вне форума Ответить с цитированием
Старый 01.12.2011, 09:39   #5
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Zer0, привет - кстати, спасибо за плюсик. Попробую его дополнительно отработать )).
Смотри, вот так будет чуть проще, правда? ))
Код:
  readln(i,j);
  if j>i then
    r:= j*j-j+1+(j-i)*((j mod 2)*2-1)
  else
    r:= i*i-i+1+(j-i)*((i mod 2)*2-1);
  writeln(r);
Ну, по крайней мере с виду ). Я думаю, ты разберешься, что к чему. Если что - спрашивай.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 01.12.2011, 09:55   #6
ubun
Форумчанин
 
Аватар для ubun
 
Регистрация: 06.12.2010
Сообщений: 198
По умолчанию

час попробую
ubun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Змейка в C++ Neo151 Помощь студентам 1 12.08.2011 12:59
змейка на с++ danzel1 Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 30.07.2011 09:06
Змейка на с++ Banner Помощь студентам 5 26.02.2011 16:42
Змейка(С++) MISHA13 Помощь студентам 1 08.02.2009 09:35