Nguồn đề bài: http://www.spoj.com/PTIT/problems/BCACM11D/
1. Đề bài BCACM11D spoj
Cho hai số nguyên tố khác nhau có bốn chữ số. Người ta cho rằng hoàn toàn có thể biến đổi từ số này thành số kia sau một số bước theo quy tắc: Tại mỗi bước ta chỉ thay đổi một chữ số trong số trước đó sao cho số tạo được trong mỗi bước đều là một số nguyên tố có bốn chữ số. Một cách biến đổi như vậy gọi là một “đường nguyên tố”.
Bài toán đặt ra là với một cặp số nguyên tố đầu vào, hãy tính ra số bước của đường nguyên tố ngắn nhất. Giả sử đầu vào là hai số 1033 và 8179 thì đường nguyên tố ngắn nhất sẽ có độ dài là 6 với các bước chuyển là:
1033
1733
3733
3739
3779
8779
8179
Input : Dòng đầu tiên ghi số bộ test, không lớn hơn 100. Mỗi bộ test viết trên một dòng bao gồm hai số nguyên tố có 4 chữ số.
Output: Với mỗi bộ test, in ra màn hình trên một dòng số bước của đường nguyên tố ngắn nhất.
Example
Input:
3
1033 8179
1373 8017
1033 1033
Output:
6
7
0
2. Hướng dẫn giải bài BCACM11D spoj PTIT – Đường nguyên tố
– xây dựng trước sàng nguyên tố.
– sử dụng BFS, thay đổi từng chữ số.
3. Code tham khảo BCACM11D spoj PTIT – Đường nguyên tố
const fi='';
nmax=1000000;
type data=longint;
var
f:text;
snt:array[0..9999] of boolean;
s,t,test:data;
Q,c:array[0..nmax+1] of data;
dau,cuoi:data;
procedure sangnt;
var i,j:data;
begin
fillchar(snt,sizeof(snt),true);
snt[1]:=false;
i:=2;
while i<=sqrt(9999) do
begin
while snt[i] = false do
inc(i);
for j:=2 to 9999 div i do
snt[i*j]:=false;
inc(i);
end;
end;
procedure them(x:data);
begin
inc(cuoi);
q[cuoi]:=x;
end;
function layra:data;
begin
layra:=q[dau];
inc(dau);
end;
procedure xuli;
var i,j,x,sobuoc,p,tmp,v:data;
begin
dau:=1; cuoi:=0;
them(s);
fillchar(c,sizeof(c),0);
c[s]:=1;
while dau<=cuoi do
begin
x:=layra;
i:=1;
while i<=1000 do
begin
p:=x div (i*10);
tmp:=x mod i;
for j:=0 to 9 do
begin
v:=p*i*10+i*j+tmp;
if (v>1000) and (snt[v]) and (c[v]=0) then
begin
c[v]:=c[x]+1;
if v = t then
begin
writeln(c[x]);
exit;
end;
them(v);
end;
end;
i:=i*10;
end;
end;
writeln(0);
end;
procedure docfile;
var i,j:data;
begin
assign(f,fi); reset(f);
readln(f,test);
for i:=1 to test do
begin
readln(f,s,t);
xuli;
end;
close(f);
end;
begin
sangnt;
docfile;
end.