dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Palīdziet izdomāt algoritmu - Ciparu apvienošana.

 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
coderpp



Joined: 20 Aug 2005
Posts: 167
Location: Rīga, Koknese, Gajiena

PostPosted: Mon Dec 03, 2007 6:45 pm    Post subject: Palīdziet izdomāt algoritmu - Ciparu apvienošana.

Ir doti vairāki cipari. Man vajag atrast/dabūt visas iespējamās kombinācijas apvienojot ciparus.

Piemērs:
Dotie skaitļi: 3 - 4 - 2 - 8 - 1 - 6
Kombinācijas:
3 - 42 - 8 - 16
34 - 28 - 16
342 - 8 - 1 - 6
3 - 4281 - 6
........
3 - 4 - 2 - 8 - 16
342816
Back to top
View user's profile Send e-mail
Storm



Joined: 11 Apr 2006
Posts: 742

PostPosted: Mon Dec 03, 2007 7:12 pm    Post subject:

vaajpraats, taas buus diezgam pamatiigs algo xD variaacijas tur ir lojoooti daudz Very Happy vai 12 != 21? xD

P.S Pastaasti kam tev to vajag? Varbuut ir daudz vienkaarsaaks variants kaa panaakt veelamo effektu... (es ceru ka tas nav tavs maajasdarbs? Very Happy)
Back to top
View user's profile
Tenjou



Joined: 22 Nov 2005
Posts: 275

PostPosted: Mon Dec 03, 2007 7:30 pm    Post subject:

Varbut, kad palīdz http://www.codeproject.com/KB/recipes/CombC.aspx
Back to top
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Mon Dec 03, 2007 9:17 pm    Post subject:

Algoritms tur nav pamatīgs. Nedaudz pamodifcētas vienkāršas permutācijas vajag pārlasīt. Tenjou pareizu vien liku iedeva, sāc ar to, ka saproti kā tur to dara.
Back to top
View user's profile Send e-mail
coderpp



Joined: 20 Aug 2005
Posts: 167
Location: Rīga, Koknese, Gajiena

PostPosted: Sun Dec 09, 2007 1:54 am    Post subject:

Luk sads brinums man sanaca:
Code:

type
  StrArray = array of string;
  IntArray = array of integer;

procedure FindNumberCombinations(var combination:StrArray; digit:IntArray);
type
  lvl = record
    start:integer;  // Norāda ar kuru ciparu sākas līmenis
    pos:integer;    // Norāda ar kuru ciparu jāsāk apvienot cipari
    len:integer;    // Norāda cik daudz ciparu jāapvieno
    number:string;  // Apvienotie cipari
  end;
var
  level:array of lvl; // Līmeņu masīvs
  digits:integer;     // Ciparu skaits
  count:integer;      // Skaitam cik kombinācijas atrastas
  active:integer;     // Norāda līmeni ar kuru strādājam
  i, j:integer;       // Cika skaitītāji
begin
  digits := Length(digit);   // Uzzinam ar cik cipariem strādāsim
  SetLength(level, (digits div 2) + 1); // Izrēķinam cik līmeņi būs vajadzīgi

  level[0].start := 1;
  level[0].len := 0;
  level[0].pos := 1;
  level[0].number := '';


  count := 0;   // Sākumā mums nav nevienas kombinācijas
  active := 0;  // Sākam ar 0. līmeni
 
  // Sākam meklēt kombinācijas
  while level[0].len < digits do
  begin
    // Ja aktīvais līmenis nav 0
    if active > 0 then
    begin
      // Ja ši līmeņa sākums nav vienāds ar iereikšējā līmeņa pozīciju + garums
      if level[active].start <> level[active - 1].pos + level[active - 1].len then
      begin
        // Pārējos līmeņos manam sākuma un pozīcijas vietu
        level[active].start := level[active - 1].pos + level[active - 1].len;
        level[active].pos := level[active].start;
        level[active].len := 2;
      end;
      level[active].number := '';
    end
    else
    begin
      // 0. līmenī tikai manīsim garumu (ciparu skaitu)
      level[active].start := 1;
      level[active].pos := 1;
      level[active].len := level[active].len + 1;
      level[active].number := '';
    end;

    count := count + 1; // Norādam ka būs vēlviena kombinācija
    SetLength(combination, count);  // Palielinam masīvu
    combination[count - 1] := '';

    // Apvienojam ciparus
    for i:=level[active].pos to level[active].pos + level[active].len - 1 do
      level[active].number := level[active].number + IntToStr(digit[i - 1]);

    // Izveidojam kombināciju
    for i:=0 to active do
    begin
      // Ja sākums un pozīcija nav vienādi, tad starpā būs viens vai vairāki cipari
      if level[i].start <> level[i].pos then
        for j:=level[i].start to level[i].start + (level[i].pos - level[i].start) - 1 do
          combination[count - 1] := combination[count - 1] + IntToStr(digit[j - 1]) + ' ';
      // Starp iegūtajiem skaitļiem saliekam atstarpes
      combination[count - 1] := combination[count - 1] + level[i].number + ' ';
    end;

    // Pieskaitam pēdējos ciparus, ja tādi ir
    for i:=level[active].pos + level[active].len to digits do
      combination[count - 1] := combination[count - 1] + IntToStr(digit[i - 1]) + ' ';

    // Ja vēl ir palikuši 2 vai vairāk cipari, tad veidojam vēlvienu līmeni
    if level[active].pos +level[active].len - 1 <= digits - 2 then
    begin
      active := active + 1;
    end

    // Ja ir palicis tikai viens cipars, tad palielinam ši līmeņa pozīciju
    else if level[active].pos + level[active].len - 1 = digits - 1 then
    begin
      level[active].pos := level[active].pos + 1;
    end

    // Ja vairāk nav ciparu un sākums nav vienāds ar pozīciju, tad palielinam garumu
    else if (level[active].pos + level[active].len - 1 = digits) and (level[active].pos <> level[active].start) then
    begin
      level[active].pos := level[active].start;
      level[active].len := level[active].len + 1;
    end

    // Ja vairāk nav ciparu un sākums ir vienāds ar pozīciju, tad ejam vienu līmeni atpakal. Tad palielinam pozīciju
    else if (level[active].pos + level[active].len - 1 = digits) and (level[active].pos = level[active].start) then
    begin
      active := active - 1;
      if active >=0 then
        level[active].pos := level[active].pos + 1;

      for i:=active + 1 to High(level) do
        level[i].start := -1;
    end;
  end;
  level := nil;
end;
Back to top
View user's profile Send e-mail
Storm



Joined: 11 Apr 2006
Posts: 742

PostPosted: Sun Dec 09, 2007 1:39 pm    Post subject:

Skaisti! Wink Ja driikst zinaat, kam tas ir domaats?
Back to top
View user's profile
coderpp



Joined: 20 Aug 2005
Posts: 167
Location: Rīga, Koknese, Gajiena

PostPosted: Mon Dec 10, 2007 4:22 pm    Post subject:

Tā bija daļa no uzdevuma skolā. Bija jātrod skaitļu ciparu kombinācijas, pēc tam iegūtie skaitļi jāsaskaita vai jāatņem, lai iegūtu kādu noteiktu skaitli.
Back to top
View user's profile Send e-mail
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group