Đến nội dung

Hình ảnh

Bài pascal mảng hai chiều!


  • Please log in to reply
Chủ đề này có 5 trả lời

#1
canhochoi

canhochoi

    Trung sĩ

  • Thành viên
  • 196 Bài viết
Đề 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!

#2
triều

triều

    VMF's Joker

  • Thành viên
  • 417 Bài viết
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)
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 &#40;A&#91;i,j+1&#93;=-1&#41; and &#40;j+1<=N&#41; do begin inc&#40;j&#41;; inc&#40;k&#41;; A&#91;i,j&#93;&#58;=B&#91;k&#93;; end;
while &#40;A&#91;i+1,j&#93;=-1&#41; and &#40;i+1<=M&#41; do begin inc&#40;i&#41;; inc&#40;k&#41;; A&#91;i,j&#93;&#58;=B&#91;k&#93;; end;
while &#40;A&#91;i,j-1&#93;=-1&#41; and &#40;j-1>=1&#41; do begin dec&#40;j&#41;;inc&#40;k&#41;; A&#91;i,j&#93;&#58;=B&#91;k&#93;;end;
while &#40;A&#91;i-1,j&#93;=-1&#41; and &#40;i-1>=1&#41; do bgein dec&#40;i&#41;;inc&#40;k&#41;;A&#91;i,j&#93;&#58;=B&#91;k&#93;;end;
until k=M*N;
end;

TÔI KHÔNG THÔNG MINH, TÔI CHỈ THÍCH ĐƯỢC KHÁM PHÁ


#3
canhochoi

canhochoi

    Trung sĩ

  • Thành viên
  • 196 Bài viết
Chỗ while (A... =-1) để làm gì vậy?Tãi sao nó phải là bằng -1?

#4
canhochoi

canhochoi

    Trung sĩ

  • Thành viên
  • 196 Bài viết
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
triều

triều

    VMF's Joker

  • Thành viên
  • 417 Bài viết
thì ý tớ là như thế
đạ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
nguyen phat tai

nguyen phat tai

    Thượng sĩ

  • Thành viên
  • 272 Bài viết

thì ý tớ là như thế
đại ý thôi . chứ code hết thì tớ ko có time ^^

const fin=&#39;nhap.txt&#39;&#59;
	   fout=&#39;xuat.txt&#39;;
 var a&#58;array&#91;1..100&#93; of longint;
	 b&#58;array&#91;1..100,1..100&#93; of longint;
	 m,n,i,j&#58;longint;
 procedure init;
 var f&#58;text;
	 t&#58;longint;
 begin
   assign&#40;f,fin&#41;;
   reset&#40;f&#41;;
   n&#58;=0;
   m&#58;=0;
   t&#58;=0;
   while not seekeoln&#40;f&#41; do
	 begin
	 n&#58;=n+1;
	 read&#40;f,a&#91;n&#93;&#41;;
	 end;
   repeat
	   m&#58;=m+1;
	   readln&#40;f&#41;;
   until seekeof&#40;f&#41;;
   reset&#40;f&#41;;
   for i&#58;=1 to m do
	 begin
	   for j&#58;=1 to n do
		 read&#40;f,a&#91;j+n*t&#93;&#41;;
	   t&#58;=t+1;
	 end;
   for i&#58;=1 to m*n do
	 for j&#58;=1 to m*n do
	   if a&#91;i&#93; <a&#91;j&#93; then
		 begin
		   t&#58;=a&#91;i&#93;;
		   a&#91;i&#93;&#58;=a&#91;j&#93;;
		   a&#91;j&#93;&#58;=t;
		 end;
   close&#40;f&#41;;
 end;
 procedure process;
   var x,t&#58;longint;
   begin
	 t&#58;=1;
	 x&#58;=1;
   repeat
	 for j&#58;=t to n-t do
	   begin
		 i&#58;=t;
		 b&#91;i,j&#93;&#58;=a&#91;x&#93;;
		 x&#58;=x+1;
	   end;
	 for i&#58;=t to m-t do
	   begin
		 j&#58;=n+1-t;
		 b&#91;i,j&#93;&#58;=a&#91;x&#93;;
		 x&#58;=x+1;
	   end;
	 for j&#58;=n+1-t downto t+1 do
	   begin
		 i&#58;=m+1-t;
		 b&#91;i,j&#93;&#58;=a&#91;x&#93;;
		 x&#58;=x+1;
	   end;
	 for i&#58;=m+1-t downto t+1 do
	   begin
		 j&#58;=t;
		 b&#91;i,j&#93;&#58;=a&#91;x&#93;;
		 x&#58;=x+1;
	   end;
	 t&#58;=t+1;
   until x=m*n+1;
 end;
 procedure fileout;
 var f1&#58;text;
   begin
	 assign&#40;f1,fout&#41;;
	 rewrite&#40;f1&#41;;
	 for i&#58;=1 to m do
	   begin
		 for j&#58;=1 to n do
		   write&#40;f1,b&#91;i,j&#93;&#58;6&#41;;
		 writeln&#40;f1&#41;;
	   end;
 close&#40;f1&#41;;
 end;
 BEGIN
   init;
   process;
   fileout;
 END.
bạn check thử lại đi
Hình đã gửi




0 người đang xem chủ đề

0 thành viên, 0 khách, 0 thành viên ẩn danh