Đề như thế này: Cho mảng hai chiều mxn. Hãy sắp xếp các số trong mảng theo chiều xoắn ốc cùng chiều kim đồng hồ từ ngoài vào trong sao cho dãy số tăng dần.
Vd: 2 3 4 5 6 0 2 3 4 5
7 11 13 10 20 sẽ thành 13 13 14 20 6
9 11 13 0 14 11 11 10 9 7
Khổ một cái là có hai ý tưởng: một ( trâu bò) biến mảng hai chiuề thành một chiều, sắp xếp cho tằng dần rồi lại đưa vào mảng hai chiều ; hai là xét cho biến chạy đ/v dòng 1 và m( chạy từ 1 đến n) , cột 1 và n ( chạy từ 1 đến m) cứ thế mà sau mỗi lần lại giảm biến đi một đơn vị . Ý tưởng là như thế! Ai có thể giúp em đánh bằng cả hai cách không???? Cảm ơn!
Bài pascal mảng hai chiều!
Bắt đầu bởi canhochoi, 26-01-2010 - 22:43
#1
Đã gửi 26-01-2010 - 22:43
#2
Đã gửi 27-01-2010 - 11:57
lâu rồi ko code nên có thể bị sai 1 số lỗi nhỏ, bạn sửa lại giúp
đầu tiên bạn sắp xếp vào mảng 1 chiều nào đó hoặc nếu dữ liệu lớn thì sắp xếp ngay trên mảng 2 chiều đó luôn (theo kiểu bình thường từ trái sang phải , từ trên xuống dưới tăng dần )
sau đó việc chuyển sang dạng xoắc ốc được thực hiện như thế này : (xem như làm theo cách sắp trên mảng 1 chiều B sang mảng 2 chiều A kích thước MxN)
đầu tiên bạn sắp xếp vào mảng 1 chiều nào đó hoặc nếu dữ liệu lớn thì sắp xếp ngay trên mảng 2 chiều đó luôn (theo kiểu bình thường từ trái sang phải , từ trên xuống dưới tăng dần )
sau đó việc chuyển sang dạng xoắc ốc được thực hiện như thế này : (xem như làm theo cách sắp trên mảng 1 chiều B sang mảng 2 chiều A kích thước MxN)
begin fillchar(A,sizeof(A),-1) { chỗ này nếu các số có thể âm thì thay -1 bằng -maxint } A[1,1]:=B[1]; i:=1; j:=1;k:=0; repeat while (A[i,j+1]=-1) and (j+1<=N) do begin inc(j); inc(k); A[i,j]:=B[k]; end; while (A[i+1,j]=-1) and (i+1<=M) do begin inc(i); inc(k); A[i,j]:=B[k]; end; while (A[i,j-1]=-1) and (j-1>=1) do begin dec(j);inc(k); A[i,j]:=B[k];end; while (A[i-1,j]=-1) and (i-1>=1) do bgein dec(i);inc(k);A[i,j]:=B[k];end; until k=M*N; end;
TÔI KHÔNG THÔNG MINH, TÔI CHỈ THÍCH ĐƯỢC KHÁM PHÁ
#3
Đã gửi 27-01-2010 - 22:29
Chỗ while (A... =-1) để làm gì vậy?Tãi sao nó phải là bằng -1?
#4
Đã gửi 27-01-2010 - 22:34
Mà theo mình nghĩ thì nếu làm như thế này thì mình mới chỉ đặt lại các phần từ của mảng hai chiều thành mảng một chiều mà? Cần phải có một đoạn sắp xêp tăng dần nữa chứ nhỉ? Mình mới làm ra thì sau khi xếp mảng hai chiều thành một chiều, sắp xếp mảng một chiều tăng dần rồi mới làm thêm cái phần này!.
#5
Đã gửi 31-01-2010 - 22:13
thì ý tớ là như thế
đại ý thôi . chứ code hết thì tớ ko có time ^^
đại ý thôi . chứ code hết thì tớ ko có time ^^
TÔI KHÔNG THÔNG MINH, TÔI CHỈ THÍCH ĐƯỢC KHÁM PHÁ
#6
Đã gửi 20-02-2010 - 12:22
thì ý tớ là như thế
đại ý thôi . chứ code hết thì tớ ko có time ^^
const fin='nhap.txt'; fout='xuat.txt'; var a:array[1..100] of longint; b:array[1..100,1..100] of longint; m,n,i,j:longint; procedure init; var f:text; t:longint; begin assign(f,fin); reset(f); n:=0; m:=0; t:=0; while not seekeoln(f) do begin n:=n+1; read(f,a[n]); end; repeat m:=m+1; readln(f); until seekeof(f); reset(f); for i:=1 to m do begin for j:=1 to n do read(f,a[j+n*t]); t:=t+1; end; for i:=1 to m*n do for j:=1 to m*n do if a[i] <a[j] then begin t:=a[i]; a[i]:=a[j]; a[j]:=t; end; close(f); end; procedure process; var x,t:longint; begin t:=1; x:=1; repeat for j:=t to n-t do begin i:=t; b[i,j]:=a[x]; x:=x+1; end; for i:=t to m-t do begin j:=n+1-t; b[i,j]:=a[x]; x:=x+1; end; for j:=n+1-t downto t+1 do begin i:=m+1-t; b[i,j]:=a[x]; x:=x+1; end; for i:=m+1-t downto t+1 do begin j:=t; b[i,j]:=a[x]; x:=x+1; end; t:=t+1; until x=m*n+1; end; procedure fileout; var f1:text; begin assign(f1,fout); rewrite(f1); for i:=1 to m do begin for j:=1 to n do write(f1,b[i,j]:6); writeln(f1); end; close(f1); end; BEGIN init; process; fileout; END.bạn check thử lại đi
0 người đang xem chủ đề
0 thành viên, 0 khách, 0 thành viên ẩn danh