9.29.2017

Đánh dấu điểm

Trên đường thẳng cho trước người ta đánh dấu  n điểm khác nhau : A1, A2,..., An  (n>=4 ), mỗi điểm được đánh dấu bằng một trong bốn màu: xanh, đỏ, tím, vàng. Mỗi màu được sử dụng ít nhất một lần trong quá  trình đánh dấu .
Lập chương trình thực hiện các công việc sau:
a)  Nhập thông tin về vị trí các điểm màu dùng để đánh dấu các điểm tương ứng đó từ bàn phím (xanh : X , đỏ : D , tím : T , vàng : V  ).
b) Chỉ ra một đoạn thẳng dài nhất trong đó thỏa mãn: Có đúng hai màu, mỗi màu xuất hiện đúng một lần và hai màu còn lại, mỗi màu xuất hiện ít nhất một lần (nếu có nhiều đoạn thỏa mãn thì đọc ra tất cả các đoạn thẳng đó mỗi đoạn trên một dòng)
   Ví dụ:
          Dãy A                                                    Đọc ra màn hình
          T V  V  D  T  V  D   X  T  V                 DOAN THOA MAN DAI NHAT LA:
                                                                         V V D T V D X

                                                            Lời giải tham khảo
USES CRT;
  var n,k,i,j,c,d1,h,max:integer;
     d,dau,cuoi:array[1..255] of integer;
     MAU: string;
  BEGIN
    CLRSCR;
    write('Vao day mau la cac ky tu in hoa: ');readln(MAU);
    WRITELN(************************);
    i:=1;
    repeat
         j:=4;
         repeat
             for k:=1 to 4 do  d[k]:=0;
             for k:=i to j do
                   begin
                   if (MAU[k]='X') then inc(d[1]);
                   if (MAU[k]='D') then inc(d[2]);
                   if (MAU[k]='T') then inc(d[3]);
                   if (MAU[k]='V') then inc(d[4]);
                   end;
             if((d[1]=1)and(d[2]=1)and(d[4]<>0)and(d[3]<>0))
                or ((d[1]=1)and(d[3]=1)and(d[2]<>0)and(d[4]<>0))
                  or ((d[1]=1)and(d[4]=1)and(d[2]<>0)and(d[3]<>0))
                    or((d[3]=1)and(d[2]=1)and(d[1]<>0)and(d[4]<>0))
                     or((d[4]=1)and(d[2]=1)and(d[1]<>0)and(d[3]<>0))
                        or((d[3]=1)and(d[4]=1)and(d[2]<>0)and(d[1]<>0))
             then
                  begin
                  inc(h);
                  if j-i+1 >max then max:=j-i+1;
                  dau[h]:=i;cuoi[h]:=j;
                  end;
         inc(j);
         until j>length(MAU);
      inc(i);
      until i>length(MAU);
      if h>0 then
         begin
           write(' Doan mau thoa man la:');
           for i:=dau[1] to cuoi[1] do write(MAU[i]);writeln;
           for i:=1 to h do
               begin
                  if cuoi[i]-dau[i]+1=max then
                    begin
                      write(' Doan mau dai nhat thoa man la:');
                    for j:=dau[i] to cuoi[i] do  write(MAU[j]);writeln;
                   end;
             end;
       end
      else writeln('Khong co doan mau nao thoa man.');
 readln

No comments:

Post a Comment

Cảm ơn bạn đã nhận xét