1. Trang chủ
  2. » Giáo án - Bài giảng

bài tóan tin mã vạch

5 416 7

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 27,5 KB

Nội dung

Bài tập về qui hoạch động Bài Mã vạch : Cho bộ 3 số (N,M,K) nguyên không âm (N<=100,M,K<=33) . Ngời ta định nghĩa mỗi bộ 3 số trên ứng với 1 mã là một xâu kí tự dạng nhị phân thoả mãn : + Chứa đúng N chữ số + Các chữ số 0 liền nhau hoặc các chữ số 1 liền nhau gọi là 1 vạch , phải có đúng M vạch + Số chữ số trong 1 vạch gọi là độ rộng của vạch . Độ rộng tối đa của vạch là K + Vạch đầu tiên của mã phải là vạch gồm các chữ số 1. Lập trình thực hiện các yêu cầu sau : 1) Lấy dữ liệu từ File MV.INP tổ chức nh sau : - Dòng đầu là 3 số N,M,K - Dòng thứ 2 là số p - P dòng tiếp theo : mỗi dòng là một mã M i (0< i <P+1) của bộ mã (M,N,K) 2) Thông tin ra gửi vào File MV.OUT : - Dòng đầu là số nêu tổng số mã của bộ mã (N,M,K) - Tiếp theo gồm p dòng , mỗi dòng ghi 1 số là vị trí của mã M i trong tự điển xếp tăng các mã của bộ mã (N,M,K) . Thí dụ File MV.INP 7 4 3 6 1110100 1101100 1001000 1000100 1101110 1110110 File MV.OUT 16 15 12 3 1 13 16 Uses Crt; Const Fi = 'Mv.inp'; Fo = 'Mv.out'; MaxN = 100; MaxM = 33; Type Pt = Array[1 13] of Byte; Ma = Array[1 104] of 0 1; Bang = Array[0 MaxM,0 MaxN] of Pt; Var N,M,K : Byte; F : Bang; X : Ma; P : Pt; Procedure Dan(P : Pt;Var X : Ma); Var i,j,t,tg : Byte; Begin FillChar(X,Sizeof(X),0); T := 0; For i:=1 to 13 do For j:=0 to 7 do Begin Inc(T); X[t] := (P[i] SHR j) and 1; End; End; Procedure Nen(X : Ma;Var P : Pt); Var i,j,t,tg : Byte; Begin FillChar(P,Sizeof(P),0); T := 0; For i:=1 to 13 do Begin Tg := 0; For j:=0 to 7 do Begin Inc(T); Tg := Tg+X[t] SHL j; End; P[i] := Tg; End; End; Procedure Cong(Var A : Ma;B : Ma); Var i,t,nho : Byte; Begin Nho := 0; For i:= 1 to 104 do Begin T := A[i]+B[i]+Nho; A[i] := T mod 2; Nho := T div 2; End; End; Procedure TaoBang; {F[x,y]=So luong cac ma co x vach , dai y ki tu } Var i,j : Byte;F3 : Text; Procedure Xaydung(x,y:Byte); Var i : Byte; A,B : Ma; Begin Dan(F[x,y],A); For i:=1 to k do If i<y then Begin Dan(F[x-1,y-i],B); Cong(A,B); End; Nen(A,F[x,y]); End; Begin FillChar(F,Sizeof(F),0); For i:=1 to M do F[i,i,1] := 1; For i:=1 to K do F[1,i,1] := 1; For i:=2 to M do For j:=i+1 to N do If i*k>=j then Xaydung(i,j); End; Procedure Nhan(Var S : String;T : Byte); Var i,tg,nho,L : Byte; Begin L := Length(S); While(L>1) and (S[1]='0') do Begin Dec(L); Delete(S,1,1); End; Nho := 0; For i:= Length(S) downto 1 do Begin Tg := (Ord(S[i])-48)*T+Nho; S[i] := Char(Tg mod 10 + 48); Nho := Tg div 10; End; If Nho<>0 then S := Char(Nho+48)+S; End; Procedure CongS(Var S1 : String;S2 : String); Var i,tg,nho,L1,L2,L : Byte; Begin Nho := 0; L1 := Length(S1); L2 := Length(S2); If L1<L2 then L := L2 Else L := L1; While Length(S1)<L do S1 := '0'+S1; While Length(S2)<L do S2 := '0'+S2; For i:=L downto 1 do Begin Tg := Ord(S1[i])+Ord(S2[i])-96+Nho; S1[i] := Char(Tg mod 10 +48); Nho := Tg div 10; End; If Nho<>0 then S1 := Char(Nho+48)+S1; End; Function Doi(P : Pt) : String; { Doi mang P dang nhi phan thanh xau } Var X : Ma; i,j : Byte; S,LT,SP : String; Begin Dan(P,X); Lt := '1'; S := '0'; j := 104; While X[j]=0 do Dec(j); For i:=1 to j do Begin Sp := LT; Nhan(Sp,X[i]); CongS(S,Sp); Nhan(Lt,2); End; Doi := S; End; Procedure Vitri(S : String;Var P : Pt); Var Ch : Char; i,j,d,L : Byte; A,B : ma; Begin FillChar(A,Sizeof(A),0); D := Length(S); For i:=M downto 2 do Begin Ch := S[1]; L := 0; While (D>0) and (S[1]=ch) do Begin Inc(L); Delete(S,1,1); Dec(D); End; Case ch of '1' : For j:=2 to L do Begin Dan(F[i-1,D+L-j+1],B); Cong(A,B); End; '0' : For j:=k-L downto 1 do Begin Dan(F[i-1,D-j],B); Cong(A,B); End; End; End; Nen(A,P); End; Procedure Lam; Var F1,F2 : Text; S : String; P : Pt; H,i : Integer; Begin Assign(F1,Fi); Reset(F1); Assign(F2,Fo); Rewrite(F2); Readln(F1,N,M,K);{Ma : N ki tu,co M vach,do rong max cua vach :k} TaoBang; S := Doi(F[M,N]); { Ghi tong so ma } Writeln(F2,S); Readln(F1,H);{ Doc so luong cac ma can chuyen tu ma thanh vitri } For i:=1 to H do Begin Readln(F1,S); Vitri(S,P); S := Doi(P); CongS(S,'1'); Writeln(F2,S); End; Close(f2); Close(F1); End; BEGIN Clrscr; Lam; Writeln('Xong'); Readln; END.

Ngày đăng: 07/09/2014, 07:12

TỪ KHÓA LIÊN QUAN

w