Nguồn đề bài: http://www.spoj.com/PTIT/problems/PTIT122F/
1. Đề bài PTIT122F spoj
Một số siêu tự nhiên là một chuỗi chứa các chữ số và dấu hỏi (ví dụ như 36?1?8). Một số X phù hợp với một số siêu tự nhiên W nếu X có thể được tạo thành từ W bằng cách thay thế dấu hỏi bằng các chữ số tùy ý. Ví dụ: 365198 phù hợp với số siêu tự nhiên 36?1?8, nhưng 360199, 361028 hoặ 36128 thì không. Viết chương trình đọc số siêu tự nhiên W và số X (có cùng độ dài n), và xác định số các số phù hợp với W và lớn hơn X.
Dữ liệu:
Gồm nhiều bộ test, mỗi bộ test gồm 2 dòng:
– Dòng 1 chứa số siêu tự nhiên W
– Dòng 2 chứa số nguyên X
Độ dài các số từ 1 đến 10 kí tự.
Dữ liệu kết thúc bởi dấu #
Kết quả:
Với mỗi bộ test, in ra trên 1 dòng số các số phù hợp với W và lớn hơn X.
Example
Input:
36?1?8
236428
8?3
910
?
5
#
Output:
100
0
4
2. Hướng dẫn PTIT122F spoj PTIT
– Thực hiện quay lui điền số vào các dấu ? và đếm kết quả
3. Code tham khảo PTIT122F spoj PTIT
const fi=''; nmax=10; type data=longint; var f:text; vt:array[1..10] of data; W,X:string; n:data; spt:data; // spt cua vt; res:data; sl:data; KQ:string; procedure try; var c:char; begin if sl=spt then begin if W>x then inc(res); end else for c:='0' to '9' do begin inc(sl); W[vt[sl]]:=c; try; dec(sl); end; end; procedure xuli; var i,j:data; begin fillchar(vt,sizeof(vt),false); n:=length(W); kq:=w; spt:=0; for i:=1 to n do if w[i]='?' then begin inc(spt); vt[spt]:=i; end; for i:=1 to spt do kq[vt[i]]:='0'; if KQ>=X then begin writeln(round(exp(ln(10)*spt))); exit; end; for i:=1 to spt do kq[vt[i]]:='9'; if KQ<X then begin writeln('0'); exit; end; sl:=0; res:=0; try; writeln(res); end; procedure docfile; var i,j:data; begin assign(f,fi); reset(f); repeat readln(f,w); if W='#'then break; readln(f,X); xuli; until 1=2; close(f); end; begin docfile; end.