Tải bản đầy đủ (.doc) (10 trang)

De-DA-HSGTin12-Daklak

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (191.32 KB, 10 trang )

Trang 1
S GIÁO D C & ÀO T O Ở Ụ Đ Ạ K THI H C SINH GI I T NH N M H C 2007-2008Ỳ Ọ Ỏ Ỉ Ă Ọ
K L KĐẮ Ắ MÔN : TIN H C 12 - THPTỌ
(180 phút, không k th i gian giao đ )ể ờ ề
Ghi chú : thi này g m 2 trang.Đề ồ
BÀI 1: ( 6 đi m) - ể Mật mã
Trong ngôn ngữ mật mã, Ciphertex dùng để chỉ một thông điệp đã mã hóa với một Key riêng
biệt, Plaintext dùng để chỉ văn bản gốc cũng có nghĩa là văn bản đã được giải mã. Trong bài toán
này Ciphertex và Key là những xâu ký tự gồm chỉ các ký tự in hoa, có thể có cả dấu cách.
Ciphertext được tạo ra bằng cách ‘cộng’ tương ứng các ký tự của Plaintext với các ký tự trong
Key với nhau. Nếu như Plaintext ngắn hơn Key thì chỉ một phần của Key được sử dụng. Một
cách tương tự nếu Plaintext dài hơn Key thì Key sẽ được sử dụng nhiều lần.
Ví dụ : Mã hóa xâu gốc ‘HELLO’ với khóa (key) là ‘CAT’
Xâu gốc : HELLO , Khóa sử dụng: CATCA
Xâu đã được mã hóa: KFFOP
Để cộng hai ký tự với nhau, sử dụng quy tắc sau: A=1, B=2, ..., Z=26. Nếu tổng của hai ký tự lớn
hơn 26, hãy lấy tổng trừ đi 26. Ví dụ : A + E = 1+5 = 6 = F, và D + X = 4+24 = 28 = 2 = B.
Cho trước một cặp xâu ký tự đã được mã hóa và khóa. Bạn hãy viết chương trình xác định xâu
gốc.
Dữ liệu vào : File văn bản Matma.inp chứa hai dòng, dòng đầu tiên chứa xâu đã được mã hóa,
dòng thứ hai chứa khóa. Cả hai chỉ gồm các ký tự in hoa (có thể có dấu cách).
Dữ liệu ra: File văn bản Matma.out chứa xâu gốc.
Ví dụ 1:
MATMA.INP MATMA.OUT
KFFOP
CAT
HELLO
Ví dụ 2:
MATMA.INP MATMA.OUT
DJCP DCO
ABBA


CHAO BAN
BÀI 2: ( 7 đi m) - ể Bảng đèn quảng cáo
Trên quảng trường thành phố có một bảng quảng cáo hình chữ nhật gồm N x M ô vuông. Mỗi ô
có một bóng đèn, mỗi bóng đèn có hai trạng thái tắt hoặc sáng, ứng với mỗi dòng cũng như mỗi
cột có một công tắc. Khi tác động đến một công tắc nào đó, tất cả các bóng đèn trên dòng hoặc
cột tương ứng sẽ đổi sang trạng thái ngược lại (đang sáng thành tắt, đang tắt thành sáng). Với
trạng thái bảng quảng cáo cho trước, bạn hãy lập trình tìm một phương án tác động lên các công
tắc để bảng quảng cáo có được nhiều bóng đèn sáng nhất.
Dữ liệu vào : File QUANGCAO.INP, trong đó:
- Dòng đầu tiên chứa hai số N và M (1≤N≤10, 1≤M≤100).
có 2 trangĐề
CHÍNH TH CĐỀ Ứ
Trang 2
- Dòng thứ i trong N dòng tiếp theo chứa M số 0 hoặc số 1 ( 1: chỉ bóng đèn sáng, 0: chỉ
bóng đèn tắt)
Các số trên một dòng được ghi cách nhau ít nhất một dấu cách và không cần kiểm tra dữ liệu.
Dữ liệu ra: File QUANGCAO.OUT . Trong đó: Dòng đầu là tổng số bóng đèn sáng trên bảng,
dòng thứ hai chứa S là số lần bạn tác động lên các công tắc. S dòng tiếp theo lần lưọt ghi ra S
công tắc theo trình tự cần bật. Dòng thứ i trong S dòng này chứa một xâu độ dài không quá 4, ký
tự đầu là ‘D’ hoặc ‘C’ tương ứng với tác động thứ i là lên dòng hay lên cột. Phần còn lại của xâu
là chỉ số của dòng hay cột tương ứng.
Ví dụ: QUANGCAO.INP QUANGCAO.OUT
4 4 16
1 0 0 1 4
0 1 1 0 C1
0 1 1 0 C4
1 0 0 1 D1
D4
BÀI 3: ( 7 đi m) – ể Robot gặp nhau.
Trên một lưới ô vuông kích thước M x N (M dòng, N cột, ≤ 100), người ta đặt hai robot A và B.

Robot A được đặt ở góc trên bên trái, còn robot B đươc đặt ở góc dưới bên phải. Mỗi ô của lưới
có thể có một vật cản hoặc không. Tại mỗi bước, mỗi robot chỉ có thể di chuyển theo các hướng
lên, xuống, trái, phải vào các ô kề cạnh không có vật cản. Hai robot gặp nhau khi chúng cùng
đứng trong một ô. Hai robot bắt đầu di chuyển đồng thời và mỗi lượt cả hai đều phải thực hiện
việc di chuyển ( nghĩa là không cho phép một robot dừng lại một ô nào đó trong khi robot kia
thực hiện bước di chuyển). Bài toán đặt ra là tìm số bước di chuyển ít nhất mà hai robot phải thực
hiện để có thể gặp nhau. Chú ý rằng tùy trạng thái của lưới, hai robot có thể không khi nào gặp
được nhau.
Dữ liệu vào cho bởi file văn bản ROBOT.INP, cấu trúc như sau:
- Dòng đầu tiên chứa hai số M, N.
- M dòng tiếp theo, mỗi dòng ghi N số gồm 0 và 1 mô tả trạng thái dòng tương ứng của lưới,
trong đó mỗi số mô tả một ô với quy ước: 0 – không có vật cản, 1 – có vật cản. Các số trên
cùng một dòng của file dữ liệu được ghi cách nhau ít nhất một dấu cách.
Dữ liệu ra : Ghi lên file văn bản ROBOT.OUT, trong đó:
- Nếu hai robot không thể gặp nhau thì ghi một dòng : ‘Hai Robot khong the gap nhau’.
- Trái lại ghi hai dòng, mỗi dòng là một dãy các ký tự viết liền nhau mô tả các bước đi của
robot: U- lên trên, D- xuống dưới, L- sang trái, R- sang phải. Dòng dầu là các bước đi của
robot A và dòng sau là các bước đi của robot B.
Ví dụ: ROBOT.INP ROBOT.OUT
4 6 DRRR
0 1 1 0 0 0 LUUL
0 0 0 0 0 1
0 0 1 0 0 1
0 1 0 1 0 0
------- Hết --------
có 2 trangĐề
Trang 3
Ghi chú: Giám thị coi thi không giải thích gì thêm.
SỞ GIÁO DỤC & ĐÀO TẠO KỲ THI HỌC SINH GIỎI TỈNH NĂM HỌC 2007-2008
ĐẮK LẮK MÔN : TIN HỌC 12 - THPT

ĐÁP ÁN VÀ HƯỚNG DẪN CHẤM ĐỀ CHÍNH THỨC

Bài 1. Mật mã (6 điểm)
Thuật toán :
Ta lấy kí tự tương ứng ở xâu đã mã hóa trừ đi kí tự tương ứng ở xâu khoá(key). Cách trừ là
dùng hàm ORD(kt). Gọi dec=ORD(Xaumahoa[i] – ORD(key[i]). Nếu dec<0 tức là ký tự
xaumahoa[i] sẽ nhỏ hơn kí tự key[i] khi đó ta phải cộng dec với 26, nếu dec >0 thì giữ nguyên
dec (chú ý dec luôn khác 0). Dec sẽ là độ lệch giữa 2 kí tự xaumahoa[i] và key[i].
Xây dựng mảng một chiều KT, trong đó KT[1] = ‘A’, KT[2] = ‘B’, ...KT[26]=’Z’. KT[dec] sẽ
cho kí tự tương ứng trong xâu gốc.
Cần chú ý trường hợp số kí tự của key nhỏ hơn số kí tự của xâu đã mã hóa (Xaumahoa), khi đó
cần phải chuẩn hóa lại xâu key theo yêu cầu đề bài.
program matma;
const
fi = 'matma.inp';
fo = 'matma.out';
kt: array[1..26] of char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var
xaumahoa,xaugoc,key:string;
l1,l2:integer;
f:text;
procedure readfile;
begin
assign(f,fi); reset(f);
readln(f,xaumahoa);
readln(f,key);
close(f);
assign(f,fo); rewrite(f);
l1:=length(xaumahoa);
l2:=length(key);

end;
procedure khoa;
var i,j:integer;
begin
if l1>l2 then
begin
j:=1;
for i:=l2+1 to l1 do
begin
key:=key+key[j];
inc(j);
có 2 trangĐề
Trang 4
end;
end;
end;
procedure xuly;
var i,dec :integer;
begin
khoa;
xaugoc:='';
for i:=1 to l1 do
begin
dec:=ord(xaumahoa[i]) - ord(key[i]);
if dec<0 then dec:=dec+26;
xaugoc:=xaugoc+kt[dec];
end;
writeln(f,xaugoc);
close(f);
end;

BEGIN
readfile;
xuly;
END.
Bài 2. Bảng đèn quảng cáo (7 điểm)
Thuật toán :
Duyệt các cách mà ta có thể thay đổi ở các dòng.
Với mỗi cách thay đổi ở các dòng, tìm cách thay đổi ở các cột để đạt số ô bóng đèn sáng lớn nhất.
Nếu trên một cột số ô sáng dc[j] ≤ (N-1) div 2 thì ta thay đổi trạng thái của tất cả các ô trong cột j.
Đếm tổng số ô sáng của cách thay đổi này. nếu nó lớn hơn Max thì ta giữ lại.
PROGRAM BANGDEN;
uses crt;
const
fi='QUANGCAO.INP';
fo='QUANGCAO.OUT';
maxn=10; maxm=100;
var
a : array[1..maxn,1..maxm] of byte;
d,kqd : array[1..maxn] of byte;
c,kqc,dc: array[1..maxm] of byte;
n,m,max,k: integer;
f: text;
procedure init;
var i,j :integer;
begin
clrscr;
max:=0;
assign(f,fi); reset(f);
có 2 trangĐề
Trang 5

readln(f,n,m);
for i:=1 to n do
begin
for j:=1 to m do read(f,a[i,j]);
readln(f);
end;
close(f);
end;
procedure update;
var i,j,dem: integer;
begin
for j:=1 to m do dc[j]:=0;
for j:=1 to m do c[j]:=0;
for i:=1 to n do
for j:=1 to m do dc[j]:=dc[j]+a[i,j];
dem:=0;
for j:=1 to m do
if dc[j] <= (n-1) div 2 then
begin
c[j]:=1;
dem:=dem+n-dc[j];
end
else dem:=dem+dc[j];
if dem>max then
begin
max:=dem;
kqd:=d;
kqc:=c;
end;
end;

procedure try(i:integer);
var j:integer;
begin
for j:=0 to 1 do
begin
d[i]:=j;
if j=1 then
for k:=1 to m do a[i,k]:=1-a[i,k];
if i=n then update else try(i+1);
if j=1 then
for k:=1 to m do a[i,k]:=1-a[i,k];
end;
end;
procedure result;
var s:integer;
begin
assign(f,fo);
có 2 trangĐề

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×