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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2009, 16:42   #1
terminadoor
Пользователь
 
Регистрация: 26.06.2008
Сообщений: 86
По умолчанию Интересная задача

Помогите плиз с интересной задачкой:
Ну а ця казка - не казка, а просто жах. Бідолашні поросята сиділи вдома і трусилися від страху, кожного разу коли пан вовк наближався до їхнього дому ближче як на сім ярдів. Так продовжуватися далі не могло і поросята вирішили домовитися з вовком...

Вони запропонували йому наступну задачу. Є шахова дошка N на N та K однакових камінців. Вовку потрібно порахувати скількома способами можна розкласти камінці по клітинках так, щоб в кожному рядку та в кожному стовпці дошки було не більше одного камінця. Якщо вовк зможе це зробити, то поросята добровільно вийдуть до нього самі, якщо ж ні то він більше не буде ніколи підходити до їхнього будиночку ближче як на сім ярдів.

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

Вхідні дані

Два цілих числа через - N, K.

Вихідні дані

Єдине число - кількість шуканих способів.

Обмеження

1 ≤ N ≤ 10000,

1 <= K <= 1000000000 (109)

Приклад введення

2 2

Приклад виведення

2

Вкратце на руском: есть доска N*N и K камней. Сколько есть способов раскласть по доске K камней так, чтоб в каждом рядке и каждом столбце доски било не больше одного камня.
TerMinAdoOR
terminadoor вне форума Ответить с цитированием
Старый 06.02.2009, 20:00   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

В общем, подумал я тут - и вот что получилось.

Проверил при значениях n и k:
2 1, 2 2, 3 1, 3 2, 3 3, 4 1, 4 2, 4 4

Код:
uses crt;
type vect = array[1..1] of byte;
pvect = ^vect;
matr = array[1..1] of pvect;
pmatr = ^matr;
var
n,k,cnt,i,j,tti,ttj : integer;
M :  pmatr;


function fn(ci,cHH,tekcnt : integer) : integer;
 var i,j,l : integer;
 fl : boolean;
 begin
 dec(cHH);
 if cHH = 0 then
  begin
  fn := tekcnt+1;
  exit;
  end;

 for i:=ci+1 to n do
  for  j:=1 to n do
   begin
   fl := true;
   for l:=1 to i-1 do
    if M^[l]^[j] = 1 then
      begin
      fl :=false;
      break;
      end;

   if fl then
    begin
    M^[i]^[j] := 1;
    tekcnt := fn(i,cHH,tekcnt);
    M^[i]^[j] := 0;
    end;

   end;
 fn := tekcnt;
 end;


begin
clrscr;
readln(n,k);
cnt := 0;
getmem(M,n*sizeof(pvect));
for i:=1 to n do
 getmem(M^[i],n*sizeof(byte));

for i:=1 to n do
 for j:=1 to n do
  M^[i]^[j] := 0;

{------------------------------}
 for i:=1 to n do
  for j:=1 to n do
   begin
   M^[i]^[j] := 1;
   cnt := cnt + fn(i,k,0);
   M^[i]^[j] := 2;

   for tti :=1 to n do
    for ttj:=1 to n do
     if M^[tti]^[ttj] <> 2 then
       M^[tti]^[ttj] := 0;
   end;

{------------------------------}
writeln(cnt);

for i:=1 to n do
 freemem(M^[i],n*sizeof(byte));
freemem(M,n*sizeof(pvect));

readln;
end.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интересная задача в Pascal cuzo Помощь студентам 9 28.12.2008 17:50
Интересная задача! - DannerDOS.kz Паскаль, Turbo Pascal, PascalABC.NET 2 16.12.2008 14:04
Интересная задача Ser Паскаль, Turbo Pascal, PascalABC.NET 3 27.02.2008 00:19
Интересная задача(MediaPlayer) PilGrim Компоненты Delphi 3 03.12.2007 08:46