zdravim,
mam za ukol napsat program, ktery pro dany pocet stavitek a stavu v zamku spocita, kolik lze stvorit ruznych klicu. Prikladam zadani
Patentní klíč, jak každý správný chmaták ví, odemyká tak, že tělo klíče projede štěrbinou (se správným profilem) a klíč spodními hrankami (kterými obvykle prořezává kapsy kalhot) zamačkává jednotlivá stavítka. V patentním zámku je K stavítek, které je (každé) možno nastavit do L (různých) poloh. Abychom ale byli schopni klíč zasunout (resp. vytáhnout), dvě po sobě jdoucí stavítka musejí být nastavena nejvýše o jedna jinak (tedy druhé je buďto ve stejné výšce jako předchozí, nebo o jeden zoubek níže, nebo o zoubek výše). Určete, kolik je možno (pro pevně zvolené drážkování) navrhnout různých klíčů (tedy ignorujte možnost, že klíč vůbec není možno do zámku zasunout). Napište program, který načte na vstupu na dvou řádcích dvě (celá) čísla K a L (v tomto pořadí) a určí, kolik je možno postavit různých klíčů do zámků s K stavítky, která je možno (každé) nastavit do L (různých) poloh. Tedy například pro vstup "2" a "3" program vypíše "7", zatímco pro vstup "3" a "2" vyjde hodnota "8". Sice to asi tentokrát nikdo neocení, ale jako obvykle je vstup ukončen aspoň jedním prázdným řádkem (tedy cokoliv za prvními dvěma řádky obsahujícími dvě celá čísla ignorujte)!
Úloha by se měla řešit dynamickým programováním.
Když jsem se nad tím tak zamýšlel, tak jsem došel k nápadu, že pro zámek o N stavítkách by mělo platit, že má 3x více možností, než zámek o N-1 stavítkách (pokud je více než 2 stavy) a poté musím odečíst ještě 2 možnosti (každý hraniční stav má pouze 2 možnosti). Ale jaksi mi toto nefunguje, stvořil jsem toto
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace klice
{
class Program
{
static void Main(string[] args)
{
int k = int.Parse(Console.ReadLine());
int l = int.Parse(Console.ReadLine());
int[] p = new int[k + 1];
p[0] = 0;
p[1] = l;
for (int i = 2; i <= k; i++)
{
int multi;
if (l > 2) multi = 3;
else multi = l;
p[i] = (p[i - 1] * multi) - 2;
}
Console.WriteLine(p[k]);
Console.ReadKey();
}
}
}
Díky za nápady.