2013-09-06 5 views
3

다음과 같은 (개념적으로는 매우 간단한) 문제가 생겨서이를 수행하는 코드를 작성하려고하지만 어려움을 겪고 있습니다. 길이가 같은 두 개의 행이 있다고 가정 해 봅시다. 각 행의 각 셀 중 어느 하나는 0 또는 예를 들어 1델파이에서 중첩 된 for-loop에 대한 대안

는 K와, 다음 행의 쌍을 고려 될 수 = 5 : 01011,

00110 이제 두 행 자유롭게에서 값을 교환 할 수 있다면 각 셀에는 행 쌍의 가능한 조합이 2 ~ 5 개가 있습니다 (일부는 고유하지 않을 수도 있음). 예를 들어, 우리는 위의 데이터에서 하나의 가능한 행 쌍으로 00010, 01111을 가질 수 있습니다. Delphi에서 가능한 모든 행 쌍을 나열하는 코드를 작성하고 싶습니다. 이것은 중첩 된 for-loop 집합과 함께하기에 충분합니다. 그러나 k의 값이 런타임에만 알려졌다면 얼마나 많은 인덱스 변수가 필요한지 모르기 때문에이 접근법을 어떻게 사용할 수 있는지 잘 모르겠습니다. 나는 k의 가치를 알지 못하기 때문에 사례 진술이 어떻게 도움이되는지를 볼 수 없다.

중첩 된 for-loop에 대한 대안이 있기를 기대하지만 어떤 생각이라도 감사 할 것입니다. 감사.

+0

을 - 일부 코드는 당신이 날 –

+0

를 이해할 수 도움이 될 것이다 "고정 된"'k'에 대해 작동하는 코드를 보여 주시겠습니까? – lurker

+0

행이 같은 길이라면 실행 시간까지 'k'를 모르는 것이 전혀 문제가되지 않습니다. 지금까지 시도한 것을 게시 할 수 있습니까? (코드를 묻는 질문은 최소한 해결책을 찾기 위해 어떤 노력을 기울여야합니다.) –

답변

4

주어 두 벡터 길이 KB, 우리는 벡터 또는 B에서 선택적으로 선택 소자 A1B1의 새로운 쌍을 생성 할 수있다. A 또는 B에서 선택할 수있는 결정은 S 비트 벡터로 지정되며 길이는 k입니다. 용 I에서 [0 .. K) S I 0 저장 I A1 에서 IB IB1 에 난. S i이 1 인 경우, 그 반대의 경우도 마찬가지입니다. 우리는이 같은 기능을 델파이로 그를 정의 할 수 있습니다

:

procedure GeneratePair(const A, B: string; S: Cardinal; out A1, B1: string); 
var 
    k: Cardinal; 
    i: Cardinal; 
begin 
    Assert(Length(A) = Length(B)); 
    k := Length(A); 
    Assert(k <= 32); 

    SetLength(A1, k); 
    SetLength(B1, k); 
    for i := 1 to k do 
    if (S and (1 shl Pred(i))) = 0 then begin 
     A1[i] := A[i]; 
     B1[i] := B[i]; 
    end else begin 
     A1[i] := B[i]; 
     B1[i] := A[i]; 
    end; 
end; 

우리가 우리에게 나타내는 비트 벡터의 순서를 줄 것이다, 0 2 K − 1 진 계산하는 경우 AB 사이의 교환 또는 교환하지 않을 문자의 가능한 모든 조합.

우리는 루프를 작성하고 모든 2 K 조합을 생성하기 위해 상기 기능을 사용할 수있다 : 유효 중첩 루프의 한 세트를 사용

A := '01011'; 
B := '00110'; 
for S := 0 to Pred(Round(IntPower(2, Length(A)))) do begin 
    GeneratePair(A, B, S, A1, B1); 
    writeln(A1, ', ', B1); 
end; 

한다. 외부 루프는 0에서 31까지의 루프입니다. 내부 루프는 1에서 k까지의 함수 내부 루프입니다.보시다시피, k의 값을 미리 알 필요가 없습니다.

1

지금, 감사 롭, 나는이 문제를 이해하는, 내가이 재귀 솔루션 제공 : 나는 당신이 할 무엇을 찾고 있는지 이해하고 있지 않다

{$APPTYPE CONSOLE} 

procedure Swap(var A, B: Char); 
var 
    temp: Char; 
begin 
    temp := A; 
    A := B; 
    B := temp; 
end; 

procedure Generate(const A, B: string; Index: Integer); 
var 
    A1, B1: string; 
begin 
    Assert(Length(A)=Length(B)); 
    inc(Index); 
    if Index>Length(A) then // termination 
    Writeln(A, ', ', B) 
    else 
    begin // recurse 
    // no swap 
    Generate(A, B, Index); 

    //swap 
    A1 := A; 
    B1 := B; 
    Swap(A1[Index], B1[Index]); 
    Generate(A1, B1, Index); 
    end; 
end; 

begin 
    Generate('01011', '00110', 0); 
    Readln; 
end.