# Trung tâm xử lý sự cố > Hỏi-Đáp về Lập trình >  giúp em làm 1 bài pascal

## bietthugeleximco

nhập 1 số s (s:word), ghi tất cả các số được tạo ra bằng cách hoán vị các chữ số của s vào mảng a.[img]data:image/png;base64,ivborw0kggoaaaansuheugaaaaeaaaabaqmaaaa  l21bkaaaaa1bmvexh5pjm+ykvaaaaaxrstlmaqobyzgaaaapjr  efucndjyaaaaaiaaeihvdmaaaaasuvork5cyii=[/img]

----------


## vomaiduyphuong

bạn nói rõ hơn đuọc ko mình ko hiểu đề>??:wacko:
nếu hoan vị thi xong:whistling:

----------


## ngoduong

cái này làm vét cạn bạn ơi. bạn cần code hay cần thuật toán? mình chỉ có thể giúp thuật toán, còn viết code thì để các bạn khác viết, mình không có nhiều thời gian.

----------


## nguyenha9889

> cái này làm vét cạn bạn ơi. bạn cần code hay cần thuật toán? mình chỉ có thể giúp thuật toán, còn viết code thì để các bạn khác viết, mình không có nhiều thời gian.


bạn giúp phần thuật toán cũng tốt lắm rồi, thanks a lot ...

----------


## huynhlam088

> cái này làm vét cạn bạn ơi.


bạn có thể chỉ rõ hơn không, mình mới học nên chưa bít nhiều

----------


## minhkiet0907

- đọc n , tách n thành các chữ số , lưu vào mảng a
- quay lui , in kq 


```
const fi='hoanvi.inp';
      fo='hoanvi.out';
var   f:text;
      n:longint; k:integer;
      x,a:array[1..21] of byte;
      dd:array[1..21] of boolean;
procedure inp;
begin
      assign(f,fi);
      reset(f);
      readln(f,n);
      k:=1;
      repeat
            a[k]:=n mod 10;
            n:=n div 10;
            inc(k);
            a[k]:=n;
      until n<10;
      close(f);
end;
procedure pri1;
var   i:bye;
begin
      for i:=1 to k do write(f,x[i],' ');
      writeln(f);
end;
procedure try(i:integer);
var   j:integer;
begin
      for j:=1 to k do
            if dd[j] then
            begin
                  x[i]:=a[j];
                  dd[j]:=false;
                  if i=k then pri1
                  else try(i+1);
                  dd[j]:=true;
            end;
end;
procedure pri;
begin
      fillchar(dd,sizeof(dd),true);
      assign(f,fo);
      rewrite(f);
      try(1);
      close(f);
end;
begin
      inp; pri;
end.
```

----------


## chucvn

> - đọc n , tách n thành các chữ số , lưu vào mảng a
> - quay lui , in kq 
> 
> 
> ```
> const fi='hoanvi.inp';
>       fo='hoanvi.out';
> var   f:text;
>       n:longint; k:integer;
> ...


bạn ơi, chương trình của bạn chỉ chạy đúng đối với số n có các chữ số khác nhau thôi.
mà ý mình là muốn lưu các số này vào một mảng cơ mà, có phải là xuất ra file đâu

----------


## thuctapseonx01

> bạn ơi, chương trình của bạn chỉ chạy đúng đối với số n có các chữ số khác nhau thôi.
> mà ý mình là muốn lưu các số này vào một mảng cơ mà, có phải là xuất ra file đâu


- chạy đúng mà bạn , bạn có thể khai biến cao lên : longint , qword 
- bạn lưu vô mảng chi thế ?

----------


## handucquan

> - chạy đúng mà bạn , bạn có thể khai biến cao lên : longint , qword


ví dụ như n = 222 thì chỉ có 1 hoán vị thôi, trong khi ct của bạn lại xuất ra những 6 số 222




> -bạn lưu vô mảng chi thế ?


lưu vô mảng để mình còn xử lí tiếp nữa...

----------


## nguyen_chien

```
procedure pri1;
var   i:bye;
begin
            for i:=1 to k do write(f,x[i],' ');
            writeln(f);
end;
```

em chỉ cần chỉnh lại cái thủ tục này là lưu vô mảng được mà.

----------


## kattykatty89

vậy cho em hỏi trường hợp n=222 như trên thì xử lí như thế nào

----------


## chuyenxemay

với bài này, bạn dùng đoạn code sau nè



> procedure hvi;
> var i:bye;
> begin
> for i:=1 to k do write(f,x_,' ');
> writeln(f);
> end;_

----------


## MinhPhuc123

hiện tại nếu em chưa hiểu hết thì chỉ cần viết thêm một function kiểm tra là được. cách kiểm tra các chữ số trong số đó có trùng nhau không thì không khó. nếu em nhập vào là một số thì lấy số đó div 10 hoặc mod 10 rồi so sánh còn nếu số đó lúc đầu nhập vào dưới dạng một chuỗi thì việc đó càng dễ dàng hơn nữa (dùng 1 vòng for là được). function này em đặt sau vị trí đọc.
tức là đọc số => kiểm tra số => if thỏa mãn thì làm tiếp, không thì nhập lại hoặc là không làm.

----------


## nguyennhu

> if thỏa mãn thì làm tiếp, không thì nhập lại hoặc là không làm.


các chữ số không nhất thiết phải khác nhau, cho nên nếu có trùng nhau thì cũng phải làm tiếp ạ ...

----------


## seosgnl001

```
const fi='hoanvi.inp';
      fo='hoanvi.out';
 
var   f:text;
      n:qword; k,d:integer;
      x,a:array[1..21] of longint;
      dd:array[1..21] of boolean;
 
procedure inp;
var   i:integer;
begin
      assign(f,fi);
      reset(f);
      readln(f,n);
      k:=1;
      repeat
            a[k]:=n mod 10;
            n:=n div 10;
            inc(k);
            a[k]:=n;
      until n<10;
      for i:=1 to k-1 do
            if a[i]=a[i+1] then inc(d);
      close(f);
end;
 
procedure pri1;
var   i:integer;
begin
      for i:=1 to k do write(f,x[i],' ');
      writeln(f);
end;
 
procedure try(i:integer);
var   j:integer;
begin
      for j:=1 to k do
            if dd[j] then
            begin
                  x[i]:=a[j];
                  dd[j]:=false;
                  if i=k then pri1
                  else try(i+1);
                  dd[j]:=true;
            end;
end;
 
procedure pri;
var   i:integer;
begin
      fillchar(dd,sizeof(dd),true);
      assign(f,fo);
      rewrite(f);
      if k=1 then write(f,n)
      else if k-1=d then for i:=1 to k do write(f,a[i],' ')
      else try(1);
      close(f);
end;
 
begin
      inp; pri;
end.
```

mình đã sửa lại code r`

----------


## bigrat96

lúc này n=222 chỉ có 1 hoán vị nhưng 112 lại có 6 hoán vị, bạn xem lại giúp mình nhé

----------


## wetti

```
const fi='hoanvi.inp';
      fo='hoanvi.out';
 
var   f:text;
      n:qword; k,d:integer;
      x,a:array[1..21] of longint;
      b:array[0..21,1..21] of longint;
      dd:array[1..21] of boolean;
 
procedure inp;
var   i:integer;
begin
      assign(f,fi);
      reset(f);
      readln(f,n);
      k:=1;
      repeat
            a[k]:=n mod 10;
            n:=n div 10;
            inc(k);
            a[k]:=n;
      until n<10;
      close(f);
end;
 
procedure pri1;
var   i:integer;
begin
      for i:=1 to n do
            if b[d,i]=x[i] then exit;
      inc(d);
      for i:=1 to k do
            b[d,i]:=x[i];
end;
 
procedure try(i:integer);
var   j:integer;
begin
      for j:=1 to k do
            if dd[j] then
            begin
                  x[i]:=a[j];
                  dd[j]:=false;
                  if i=k then pri1
                  else try(i+1);
                  dd[j]:=true;
            end;
end;
 
procedure pri;
var   i,j:integer;
begin
      fillchar(dd,sizeof(dd),true);
      fillchar(b,sizeof(b),0);
      if k=2 then write(f,a[1])
      else try(1);
      assign(f,fo);
      rewrite(f);
      for i:=1 to d do
      begin
            for j:=1 to k do
                  write(f,b[i,j],' ');
            writeln(f);
      end;
      close(f);
end;
 
begin
      inp; pri;
end.
```

---------------------------------bài viết đã được trộn ---------------------------------
giải thix code 

- đọc , tách số thành các chữ số (= lệnh div , mod ) lưu vào mảng a
- nếu k =2 ( tức n là số có 1 chữ số ) thì in ra a[1] lun 
ngược lại gọi quay lui 
- trong proce try , nếu i=k và mảng x vừa tạo đc k giống bất kì mảng nào trước đây đã tạo thì lưu vô mảng b ( là mảng 2 chiều )
- in mảng 2 chiều

----------


## khicaca

> for i:=1 to n do
> if b[d,i]=x_ then exit;
> _


_
ở đây mình nghĩ nếu như b[d,i]=x với mọi i từ 1 tới k thì mới exit.
còn nếu b[d,i]=x chỉ tại 1 vài vị trí i thì chưa chắc 2 hoán vị này đã giống nhau, cho nên có thể làm mất các hoán vị của n._

----------


## dvitngoctu

> ở đây mình nghĩ nếu như b[d,i]=x_ với mọi i từ 1 tới k thì mới exit.
> còn nếu b[d,i]=x chỉ tại 1 vài vị trí i thì chưa chắc 2 hoán vị này đã giống nhau, cho nên có thể làm mất các hoán vị của n._


[i][i]

cảm ơn bạn , mình xin lỗi bạn rất nhìu . làm bài mà cứ để lỗi lên lỗi xuống :down:
hy vọng là k sai nữa


```
const fi='hoanvi.inp';
      fo='hoanvi.out'; 
 
var   f:text;
      n:longint; k,d,h:integer;
      x,a:array[1..21] of longint;
      b:array[0..21,1..21] of longint;
      dd:array[1..21] of boolean;
 
procedure inp;
var   i:integer;
begin
      assign(f,fi);
      reset(f);
      readln(f,n);
      k:=1;
      repeat
            a[k]:=n mod 10;
            n:=n div 10;
            inc(k);
            a[k]:=n;
      until n<10;
      close(f);
end;
 
function kt:boolean;
var   i,j:integer;
begin
      kt:=false;
      for i:=1 to d do
      begin
            h:=0;
            for j:=1 to k do
            begin
                  if b[i,j]=x[j] then inc(h)
                  else break;
                  if k=h then exit;
            end;
      end;
      kt:=true;
end;
 
procedure pri1;
var   i:integer;
begin
      inc(d);
      for i:=1 to k do
            b[d,i]:=x;
end;
 
procedure try(i:integer);
var   j:integer;
begin
      for j:=1 to k do
            if dd[j] then
            begin
                  x:=a[j];
                  dd[j]:=false;
                  if (i=k) and kt then pri1
                  else try(i+1);
                  dd[j]:=true;
            end;
end;
 
procedure pri;
var   i,j:integer;
begin
      fillchar(dd,sizeof(dd),true);
      fillchar(b,sizeof(b),0);
      if k=2 then write(f,a[1])
      else try(1);
      assign(f,fo);
      rewrite(f);
      for i:=1 to d do
      begin
            for j:=1 to k do
                  write(f,b[i,j],' ');
            writeln(f);
      end;
      close(f);
end;
 
begin
      inp; pri;
end.

```

----------

