Nguồn đề bài: http://www.spoj.com/PTIT/problems/P132SUMJ/
1. Đề bài P132SUMJ spoj PTIT
Cho trước một số nguyên dương X. Nhiệm vụ của bạn là tìm số nhỏ nhất lớn hơn X, mà có các chữ số giống hệt với X.
Input
Dòng đầu tiên là số nguyên X (1 ≤ X ≤ 999 999).
Chữ số đầu tiên của X luôn khác 0.
Output
In ra đáp số trên một dòng. Nếu không có đáp số, in ra “0”.
Example
Test 1:
Input:
156
Output:
165
Test 2:
Input:
330
Output:
0
Test 3:
Input:
27711
Output:
71127
2. Thuật toán bài P132SUMJ spoj PTIT
Đưa bài toán về dạng quay lui sinh hoán vị. Dễ dàng nhận thấy dãy hoán vị sinh được từ thuật toán quay lui sẽ tăng dần. do đó đầu tiên sắp xếp thứ tự các số từ nhỏ đến lớn. sau đó dùng thuật toán quay lui để tìm kết quả. nếu tìm thấy số lớn hơn số ban đầu thì đó chính là kết quả bài toán.
3. Code tham khảo P132SUMJ spoj PTIT
const fi=''; nmax=999999; type data=longint; var f:text; kq,S,A,tmp:string; n,sl,i:data; dd:array[1..6] of boolean; procedure sort(l,r: longint); var i,j: longint; y,x:char; begin i:=l; j:=r; x:=s[(l+r) div 2]; repeat while s[i]<x do inc(i); while x<s[j] do dec(j); if not(i>j) then begin y:=s[i]; s[i]:=s[j]; s[j]:=y; inc(i); j:=j-1; end; until i>j; if l<j then sort(l,j); if i<r then sort(i,r); end; procedure try; var i:data; begin if sl=n then begin if kq>a then begin writeln(kq); halt; end; end else for i:=1 to n do if not dd[i] then begin inc(sl); dd[i]:=true; kq[sl]:=s[i]; try; dd[i]:=false; dec(sl); end; end; begin assign(f,fi); reset(f); readln(f,s); close(f); n:=length(s); a:=s; kq:=s; sort(1,n); for i:=n downto 1 do tmp:=tmp+s[i]; if tmp=a then begin writeln(0); halt; end; fillchar(dd,sizeof(dd),false); sl:=0; try; writeln(0); end.
Chị nhập 156 sao kết quả lại ra 651 nhỉ
Ủa chị, em nhập 156 vẫn ra 165 mà chị 😀
https://ideone.com/mKqg0v