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

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Координаты картофелин
Merhaba
сообщение 12.05.2011 19:48
Сообщение #1


Пионер
**

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

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


Добрый Вечер!!!
Помогите Пожалуйста решить задачу, очень надо!!!
Ограничение времени: 0.5 секунды
Ограничение памяти: 64 МБ

Анка и Петька ждали Чапаева и ели картошку. Вскоре они наелись и решили поиграть в «Чапаева» оставшимися четырьмя картофелинами.
Петька достал доску размером 20 × 20 клеток, положил на неё картофелины и сказал, что по правилам никакие две картофелины не могут находиться в одной клетке, а одной картофелиной можно сбить другую только в том случае, если они расположены на одной горизонтали или вертикали и между ними нет других картофелин.
Анка предложила взять некоторые картофелины и поставить их на другие свободные клетки так, чтобы каждой картофелиной можно было сбить ровно одну другую. Помогите Петьке переставить как можно меньше картофелин, чтобы выполнить её просьбу.
Исходные данные
В четырёх строках записаны координаты картофелин xi, yi — целые числа в пределах от 1 до 20. Никакие две картофелины не расположены в одной клетке.
Результат
Выведите новые координаты картофелин. Картофелины следует описывать в том же порядке, в котором они заданы на входе. Если возможных ответов несколько, выведите любой.

Пример:
1 1
2 2
4 4
4 3
Результат:
1 2
2 2
4 4
4 3
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Unconnected
сообщение 21.05.2011 14:17
Сообщение #2


mea culpa
*****

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

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


Не знаю, нужно ли ещё, но вот (экзамены на носу, времени мало, да и не получалось поначалу..).
Тут типа полный перебор, с отбором лучшего положения (страшноват, правда(очень)). Делаются лишние действия, но вроде работает.

{$APPTYPE CONSOLE}

const c=4;mp=20;
type TBin=0..1;
type TPotate=record
x,y,b:byte;
end;

var
i,j,xx,yy,n:byte;
z:integer;
m:array[1..mp,1..mp] of TBin;
p,br:array[1..c] of TPotate;

function bcount(p,k:byte):byte;
var d,e:byte;
begin
result:=0;e:=0;
for d:=1 to mp do
if (m[p,d]=1) then if (d<>k) then begin
inc(result);inc(e);
end else begin
if e>1 then begin
dec(result,e-1);e:=0;
end;e:=0;
end;
if e>1 then dec(result,e-1);e:=0;
for d:=1 to mp do
if (m[d,k]=1) then if (d<>p) then begin
inc(result);inc(e);
end else begin
if e>1 then begin
dec(result,e-1);e:=0;
end;e:=0;
end;
if e>1 then dec(result,e-1);
end;

function chOk:boolean;
begin
result:=true;
for xx:=1 to mp do
for yy:=1 to mp do if (m[xx,yy]=1) and (bcount(xx,yy)<>1) then begin
result:=false;break;
end;
end;

Procedure PCount;
var r,t,u:byte;
begin
u:=1;
for r:=1 to mp do
for t:=1 to mp do begin
if m[r,t]=1 then with p[u] do begin
x:=r;y:=t;b:=bcount(x,y);inc(u);
end;
end;
end;


Procedure wou;
begin
for i:=1 to mp do begin
for j:=1 to mp do write(m[i,j]);
writeln;
end;writeln;readln;
end;

Procedure toex;
begin
fillchar(m,sizeof(m),0);
for i:=1 to c do with p[i] do m[x,y]:=1;
wou;
end;

Procedure rec(h:byte);
var d,f,t,l,xb,yb:byte;
begin
if (h=c+1) then begin
l:=0;inc(z);
for d:=1 to mp do
for f:=1 to mp do if m[d,f]=1 then begin
for t:=1 to c do if ((br[t].x=d) and (br[t].y=f)) then inc(l);
end;
l:=c-l;
if chOk then begin
if l<n then begin
n:=l;
pcount;
if n=1 then toex;
if z>mp*mp then if n=2 then toex;
end;
end;
end else begin
xb:=p[h].x;yb:=p[h].y;
for d:=1 to mp do begin
for f:=1 to mp do begin
if (m[d,f]=0) or ((d=xb) and (f=yb)) then begin
m[d,f]:=1;
if not((d=xb) and (f=yb)) then m[xb,yb]:=0;
rec(h+1);
m[d,f]:=0;
m[xb,yb]:=1;
end;
end;
end;
end;
end;

begin
fillchar(m,sizeof(m),0);
for i:=1 to c do begin
read(xx,yy);m[xx,yy]:=1;
end;writeln;
PCount;
wou;
n:=c;br:=p;z:=0;
rec(1);
toex;
end.


Что интересно, процедура вывода матрицы изначально называлась wout; , что, наверное, является каким-то служебным словом.. факт в том, что readln; после последнего wout-а не останавливал прогу. Пришлось переименовать)
И да, мне кажется в таких задачах лучше перебор (хоть и с оптимизациями возможными, отсечениями), чем думать что-то типа "таак, оптимальная ситуация это когда в одной грядке 2 картошки, и переставим ещё одну, тогда..."..., короче, пытаться сделать однопроходно. Ибо задача может трансформироваться в пересадку 5 картошек, и тогда думать придется заново)

Сообщение отредактировано: Unconnected - 21.05.2011 15:50


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Merhaba
сообщение 21.05.2011 19:47
Сообщение #3


Пионер
**

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

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


Цитата(Unconnected @ 21.05.2011 15:17) *

Не знаю, нужно ли ещё, но вот (экзамены на носу, времени мало, да и не получалось поначалу..).
Тут типа полный перебор, с отбором лучшего положения (страшноват, правда(очень)). Делаются лишние действия, но вроде работает.



Спасибо Вам Большое за помощь!!! give_rose.gif попробовал закинуть на контест, выдало ошибку: ТаймЛимит на 1-ом тесте. Как можно оптимизировать код, чтобы уложится в 0,5 секунды?

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

Сообщений в этой теме
Merhaba   Координаты картофелин   12.05.2011 19:48
Unconnected   Слабонервным не читать :blink: {$APPTYPE CO...   12.05.2011 23:57
Merhaba   Слабонервным не читать :blink: {$APPTYPE C...   13.05.2011 6:23
Unconnected   Задаётся массив из 4-х элементов типа TPotate, в н...   13.05.2011 7:26
Merhaba   Задаётся массив из 4-х элементов типа TPotate, в ...   13.05.2011 7:46
Unconnected   type TPotate=record x,y,b:byte; end; var p:arra...   13.05.2011 7:54
Merhaba   type TPotate=record x,y,b:byte; end; var p:arr...   13.05.2011 8:30
Lapp   Un, что-то у тебя не то.. Я добавил псевдографику...   13.05.2011 9:24
sheka   Объясните задание, пожалуйста.   13.05.2011 9:43
Lapp   Объясните задание, пожалуйста. На доске 4 ладьи....   13.05.2011 10:53
Merhaba   На доске 4 ладьи. Переместить минимальное количе...   13.05.2011 18:47
Merhaba   На доске 4 ладьи. Переместить минимальное количе...   13.05.2011 20:03
Merhaba   На доске 4 ладьи. Переместить минимальное количе...   18.05.2011 19:48
sheka   http://www.google.com.ua/search?hl=ru&q=pa...256l2...   13.05.2011 19:57
Unconnected   Это не очень правильное решение, как оказалось, не...   13.05.2011 20:29
Merhaba   Это не очень правильное решение, как оказалось, н...   14.05.2011 17:44
Unconnected   Не знаю, нужно ли ещё, но вот (экзамены на носу, в...   21.05.2011 14:17
Merhaba   Не знаю, нужно ли ещё, но вот (экзамены на носу, ...   21.05.2011 19:47


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

 



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