You are on page 1of 15

Một số bài tập về đối xứng:

1. Cho trước một xâu ký tự, kiểm tra xem xâu đó có đối xứng hay không?
2. Cho trước một dãy số nguyên, kiểm tra xem dãy đã cho có đối xứng hay
không?
3. Cho trước một số nguyên, kiểm tra xem số đã cho có đối xứng hay không?
4. Cho một dãy số nguyên. Hãy đọc ra các số đối xứng có trong dãy.
5. Đọc ra tất cả các số nguyên đối xứng có m chữ số (m<=6).
6. Cho trước một số nguyên. Hãy kiểm tra xem số đó có đối xứng nhị phân hay
không?
7. In ra tất cả các số vừa đối xứng thập phân, vừa đối xứng nhị phân trong đoạn
n tới m.
Bài 8. Đối xứng gương

Xét tập các chữ cái La tinh in hoa sau:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

Một số chữ cái có các tính chất đặc biệt như sau:

a) Đối xứng gương qua trục đối xứng đứng, ví dụ chữ cái A có tính chất như vậy. Ngoài chữ A còn có các ký tự
"H","I","M","O","T","U","V","W","X","Y".
b) Đối xứng gương qua trục đối xứng ngang, ví dụ chữ cái B có tính chất như vậy. Cùng với B còn có các ký tự
"C","D","E","H","I", "K","O","X".
c) Không đổi khi xoay ký tự 1800, ví dụ chữ S. Các ký tự "H","I","N","O","X","Z" cũng có tính chất này.
Một xâu có tính chất đặc biệt nếu như mỗi ký tự của xâu đều có tính chất đặc biệt đó.

Yêu cầu: Với xâu cho trước không quá 250 ký tự, hãy xác định xâu có tính chất a), b) hay c) hay không?

Dữ liệu vào: Cho trong file DOIXUNG.INP, gồm một dòng chứa một xâu kí tự.

Dữ liệu ra: Xuất ra file văn bản DOIXUNG.OUT theo định dạng sau: Nếu xâu đã cho không có tính chất đặc
biệt, ghi NO. Nếu xâu đã cho có tính chất đặc biệt, thì:

 Dòng đầu ghi YES


 Dòng thứ hai ghi số 1 nếu xâu đã cho có tính chất a); ghi số 2 nếu xâu đã cho có tính chất b); ghi số 3 nếu
xâu đã cho có tính chất c); ghi số 0 nếu xâu đã cho có cả 3 tính chất trên.
Ví dụ:

DOIXUNG.IN
DOIXUNG.INP DOIXUNG.OUT DOIXUNG.OUT
P
YES
HELLO NO OTO
1

9, Cho trước một xâu ký tự, hãy đọc ra các xâu con đối xứng dài nhất.
10. Cho một dãy số nguyên, Hãy đọc ra tất cả các đoạn con liên tiếp đối xứng
dài nhất.
Tư tưởng thuật toán và lời giải tham khảo
Bài 1: Tư tưởng thuật toán:
- Xây dựng hàm kiểm tra đối xứng
- Gọi hàm kiểm tra, rồi kết luận.

{var st:string;

f,g:text;

function ktdx(s:string):boolean;

var k:integer;

begin

ktdx:=false;

for k:=1 to length(s) do

if s[k]<>s[length(s)-k+1] then exit;

ktdx:=true;

end;

begin

assign(f,'bl.inp');reset(f);

assign(g,'bl.out'); rewrite(g);

read(f,st);

if ktdx(st) then write(g,'CO')

else

Write(g,'KHONG');

close(f);

Close(g);

End. }

Bài 2: Tư tưởng thuật toán:


- Duyệt toàn bộ dãy.
- Đếm những phần tử khác nhau qua trục đối xứng.
- Dựa vào biến đếm để kết luận.

{var a:array[1..1000] of longint;

n,i,d:longint; w:string;

f,g:text;

begin

assign(f,'bl.inp');reset(f);

assign(g,'bl.out'); rewrite(g);

readln(f,n);

for i:=1 to n do

read(f,a[i]);

for i:=1 to n do

if a[i]<>a[n-i+1] then inc(d);

if d=0 then write(g,'CO')

else write(g,'KHONG');

close(f);

close(g);

end. }

Bài 3: Tư tưởng thuật toán:


- Xây dựng hàm kiểm tra đối xứng.
- Chuyển số thành xâu.
- Gọi hàm kiểm tra, rồi kết luận.

{ var a:array[1..1000] of longint;

n,i,d:longint; w:string;

f,g:text;
function ktdx(s:string):boolean;

var k:integer;

begin

ktdx:=false;

for k:=1 to length(s) do

if s[k]<>s[length(s)-k+1] then exit;

ktdx:=true;

end;

begin

assign(f,'bl.inp');reset(f);

assign(g,'bl.out'); rewrite(g);

readln(f,n);

str(n,w); {Chuyển số thành xâu}

if ktdx(w) then write(g,'CO')

else write(g,'KHONG');

close(f);

close(g);

end.}

{Doc ra cac so doi xung co trong day}

Bài 4: Tư tưởng thuật toán:


- Xây dựng hàm kiểm tra đối xứng.
- Chuyển lần lượt từng số về xâu.
- Gọi hàm kiểm tra, rồi kết luận.

{var a:array[1..1000] of longint;

n,i,d:longint; w:string;

f,g:text;
function ktdx(s:string):boolean;

var k:integer;

begin

ktdx:=false;

for k:=1 to length(s) do

if s[k]<>s[length(s)-k+1] then exit;

ktdx:=true;

end;

begin

assign(f,'bl.inp');reset(f);

assign(g,'bl.out'); rewrite(g);

readln(f,n);

for i:=1 to n do

read(f,a[i]);

for i:=1 to n do

begin

str(a[i],w);

if ktdx(w) then

begin

inc(d);

write(g,w,' ');

end;

end;

if d=0 then

write(g,'KHONG CO');

close(f);

close(g);
end.}

{============Doc ra so doi xung co m chu so======}

Bài 5: Tư tường thuật toán:


- Xây dựng hàm kiểm tra đối xứng.
- Xây dựng hàm mũ.
- Duyệt tất cả các số có m chữ số.
- Chuyển từng số thành xâu
- Gọi hàm KTDX.

{var a:array[1..1000] of longint;

m,n,i,d:longint; w:string;

f,g:text;

function ktdx(s:string):boolean;

var k:integer;

begin

ktdx:=false;

for k:=1 to length(s) do

if s[k]<>s[length(s)-k+1] then exit;

ktdx:=true;

end;

function mu(p,q:integer):longint;

begin

if q=0 then mu:=1

else mu:=p*mu(p,q-1);

end;

begin

assign(f,'bl.inp');reset(f);

assign(g,'bl.out'); rewrite(g);

readln(f,m);
for i:=mu(10,m-1) to mu(10,m)-1 do

begin

str(i,w);

if ktdx(w) then

begin

inc(d);

write(g,w,' ');

end;

end;

if d=0 then

write(g,'KHONG CO');

close(f);

close(g);

end.}

{================Kiem tra so doi xung nhi phan=========}

Bài 6: Tư tưởng thuật toán:


- Xây dựng hàm kiểm tra đối xứng
- Xây dựng hàm đổi nhị phân.
- Gọi hàm kiểm tra, rồi kết luận.

{var a:array[1..1000] of longint;

m,n,i,d:longint; w:string;

f,g:text;

function ktdx(s:string):boolean;

var k:integer;

begin

ktdx:=false;

for k:=1 to length(s) do


if s[k]<>s[length(s)-k+1] then exit;

ktdx:=true;

end;

function DNP(k:longint):string;

var st:string;

begin

st:='';

repeat

if k mod 2=0 then st:='0'+st else st:='1'+st; k:=k div 2;

until k=0;

DNP:=st;

end;

begin

assign(f,'bl.inp');reset(f);

assign(g,'bl.out'); rewrite(g);

readln(f,m);

if ktdx(dnp(m)) then

write(g,'CO')

else

write(g,'KHONG');

close(f);

close(g);

end.}

{= In ra cac so vua Doi xung nhi phan vua doi xung thap phan tu n toi m=}

Bài 7: Tư tường thuật toán:


- Xây dựng hàm kiểm tra đối xứng
- Xây dựng hàm đổi nhị phân
- Gọi hàm kiểm tra, rồi kết luận.

{var a:array[1..1000] of longint;

m,n,i,d:longint; w:string;

f,g:text;

function ktdx(s:string):boolean;

var k:integer;

begin

ktdx:=false;

for k:=1 to length(s) do

if s[k]<>s[length(s)-k+1] then exit;

ktdx:=true;

end;

function DNP(k:longint):string;

var st:string;

begin

st:='';

repeat

if k mod 2=0 then st:='0'+st else st:='1'+st; k:=k div 2;

until k=0;

DNP:=st;

end;

begin

assign(f,'bl.inp');reset(f);

assign(g,'bl.out'); rewrite(g);

readln(f,n,m);
for i:=n to m do

begin

str(i,w);

if (ktdx(w)) and (ktdx(dnp(i))) then

begin

write(g,i,' ');

inc(d);

end;

end;

if d=0 then

write(g,'KHONG CO');

close(f);

close(g);

end.}

{==========Doi xung guong=========}

Bài 8: Tư tưởng thuật toán:


- Xây dựng hàm kiểm tra đối xứng
- Kiểm tra xâu đã cho xem các ký tự thuộc tính chất nào
- Xét từng tính chất
- Gọi hàm kiểm tra, rồi kết luận.

{var a:array[1..1000] of longint;

m,n,i,d,d1,d2:longint; st:string;

f,g:text;

function ktdx(s:string):boolean;

var k:integer;

begin

ktdx:=false;
for k:=1 to length(s) do

if s[k]<>s[length(s)-k+1] then exit;

ktdx:=true;

end;

begin

assign(f,'bl.inp');reset(f);

assign(g,'bl.out'); rewrite(g);

readln(f,st);

for i:=1 to length(st) do

begin

if st[i] in['A','H','I','M','O','T','U','W','X','Y'] then inc(d);

if st[i] in['B','C','D','E','H','I','K','O','X'] then inc(d1);

if st[i] in['S','H','I','N','X','Z'] then inc(d2);

end;

if (ktdx(st)) and (d=length(st))and (d1=length(st))and (d2=length(st)) then

write(g,'YES ',0)

else

if (ktdx(st)) and (d=length(st)) then

write(g,'YES ',1)

else

if (ktdx(st)) and (d1=length(st)) then

write(g,'YES ',2)

else

if (ktdx(st)) and (d2=length(st)) then

write(g,'YES ',3)

else write(g,'NO');
close(f);

close(g);

end. }

{==================Xau con doi xung dai nhat==============}

Bài 9: Tư tưởng thuật toán:


- Xây dựng hàm kiểm tra đối xứng
- Dùng hai biến đếm (Xuôi, ngược)
- Copy đoạn giữa hai biến để kiểm tra, nếu đx thì lưu lại vào mảng
- Sắp xếp mảng giảm dần.
- Duyệt lại chuỗi ban đầu, nếu đoạn nào đối xứng có chiều dài đoạn nào lớn
nhất thì in ra.

{var a:array[1..100] of string;

m,n,i,j,d:longint; st,tg:string;

f,g:text;

function ktdx(s:string):boolean;

var k:integer;

begin

ktdx:=false;

for k:=1 to length(s) do

if s[k]<>s[length(s)-k+1] then exit;

ktdx:=true;

end;

begin

assign(f,'bl.inp');reset(f);

assign(g,'bl.out'); rewrite(g);

readln(f,st);

i:=1;
repeat

j:=length(st);

repeat

if (ktdx(copy(st,i,j-i+1))) then

begin

inc(d);

a[d]:= copy(st,i,j-i+1) ;

end;

dec(j);

until j=i;

inc(i);

until i=length(st);

for i:=1 to d-1 do

for j:=i+1 to d do

if length(a[i])<length(a[j]) then

begin tg:=a[i]; a[i]:=a[j]; a[j]:=tg; end;

for i:=1 to length(st)-1 do

if ktdx(copy(st,i,length(a[1]))) then

writeln(g, copy(st,i,length(a[1])));

close(f);

close(g);

end.}

{===========Doan con lien tiep doi xung dai nhat=======}

Bài 10: Tư tưởng thuật toán:


- Dùng hai biến đếm thuận và ngược.
- Kiểm tra đoạn giữa hai biến đếm đó, nếu đx thì đánh dấu điển đầu và điểm
cuối, đồng thời tìm chiều dài đx lớn nhất.
- Duyệt lại các đoạn đx, có những đoạn nào có chiều dài lớn nhất thì in ra.
{ var a,c,d:array[1..1000] of longint;

m,n,i,j,k,h,max,d1:longint;

f,g:text;

begin

assign(f,'bl.inp');reset(f);

assign(g,'bl.out'); rewrite(g);

readln(f,n);

for i:=1 to n do

read(f,a[i]);

i:=1;

repeat

j:=n;

repeat

d1:=0;

for k:=i to j do

if a[k]<>a[j-k+i] then inc(d1);

if d1=0 then

begin

if j-i>=max then

begin

max:=j-i;

inc(h);

d[h]:=i; c[h]:=j;

end;

end;
dec(j);

until j=i;

inc(i);

until i=n;

if h=0 then

write(g,'KHONG CO DOAN CON THOA MAN')

else

Begin

for i:=1 to h do

if c[i]-d[i]=max then

begin

for j:=d[i] to c[i] do

write(g,a[j],' ');

writeln(g);

end;

end;

close(f);

close(g);

end.}

You might also like