1. Trang chủ
  2. » Công Nghệ Thông Tin

Bai toan ma phuong chan le

8 310 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 8
Dung lượng 179,5 KB

Nội dung

Ma Phương Nguyễn Trường Đức Trí Dântộc Shang chia giới làm chín phần Chính vương quốc họ Nhữngphần khác núi, sa mạc vùng đất người chưa biết đến Nếu vịhoàng đế giữ cho phần đất hoà bình thịnh vượng, thượng đế sẽlàm cho phần đất lại phải làm việc để xây dựng thếgiới hoàn thiện Saunày, người Trung Quốc sử dụng sáng kiến để xây dựng nên ma phương số.Nếu ô vuông đứng vị trí nó, hàng ngang, dọc, chéo có tổnggiống Đây dấu hiệu giới hoàn thiện Chúng ta không biếtmỗi số phải đứng đâu Nhưng phần giới đứng sai vị trí cảthế giới bị lộn xộn Nhiệmvụ xếp số theo trật tự để tạo thành giớihoàn thiện Các khái niệm maphương Trướckhi bắt đầu công việc mình, phải nắm số khái niệm: -Ma phương số cấp n hình vuông gồm n2 số nguyên khác đượcsắp xếp cho tổng số theo hàng ngang, cột dọc, theo đường chéo làbằng nhau, số gọi số ma hình vuông Ma phương gọi chuẩn n2 số n2 sốnguyên dương Ngườita chứng minh số ma ma phương chuẩn cấp n Tronggiới hạn viết này, xin trình bày hiểu biết vềcách xây dựng ma phương chuẩn cấp n Thuật toán cách giải ma phương bậc n Chắc bạn biết giải ma phương bậcba, năm, bảy số lẻ theo toán học Chúng ta vẽ thêm tháp vào cạnhcủa hình vuông sau: Sau điền số tháp vào hình vuông.Cách giải biết nên xin không nhắc lại Thế để môphỏng cách giải máy vi tính ta phải mở rộng ma trận vànhư tốn nhớ Ta phải làm với ô không chứa số Quả mộtlượng nhớ lớn không sử dụng cách đáng giá phải không nàoTôi xin trình bày cách giải ma phương lẻ không cần mở rộng mảng: Bắt đầu số sẽđứng hàng đầu tiên, cột Bạn phải quân cờ Thuậttoán lên, qua phải, đụng xuống dưới, dụngtường phải qua tường trái Còn bạn phải vào ô có số rồithì xin mời bạn lùi lại chỗ cũ xuống ô Xong trình bạnsẽ có ô dừng chân, điền số vào ô Thuật toán có thểgiúp giải toán ma phương bậc lẻ trở nên dễ dàng nhiều khôngcần mở rộng mảng (Trường hợp số 5, lênqua phải, ô có số nên phải trở vị trí số xuống 1ô) Cứ chođến bạn hết mảng Nếu làm ma phương bậc bạn thu kếtquả sau Tôi nghĩ việc làm chương trình để giải ma phương bậc lẻ việc khôngkhó phải không Procedure MaPhuongLe; vardem:integer; luui,luuj:integer; begin fillchar(a,sizeof(a),0); dem:=1;i:=1; j:=n div 2+1; repeat a[i,j]:=dem; inc(dem); luui:=i;luuj:=j; i:=i-1; j:=j+1; ifin then j:=1; ifa[i,j]0 then begin i:=luui+1;j:=luuj; end; untildem>n*n; end; Rõ ràng, áp dụng thuật toán cho ma phươngbậc chẵn Với bậc chiahết cho cần đánh dấu số ô tạm gọi ô đối xứng tâm (kíhiệu viết chữ x) số gặp ô qua ô đối xứngtâm với Chia ma trận ta làm bốn phần Số lần xuất kí hiệu xtrên dòng, cột phần không vượt n/4 Chẳng hạnvới n=4 hàng, mảng nhỏ 2x2 có dấu x Sau lấy đốixứng kí hiệu qua tâm (Xem sơ đồ) Hình Bắt đầu từ số 1ở hàng cột đầu tiên, điền số từ trái sang phải, từ xuống dưới, cácô có đánh dấu x có số điền chuyển số qua ô đối xứng tâm với Hình Ví dụ ma phương bậc Hình Còn ma phương bậc chẵn không chia hết cho 4,ngoài việc đánh dấu ô đối xứng qua tâm, phải đánh dấu ôđối xứng qua trục (trục đứng trục ngang) Qui tắc đánh dấu ô đối xứngtâm giống n không chia hết lấy phầnnguyên phép chia n cho Còn ô đối xứng qua trục (kí hiệu | :đối xứng qua trục đứng; _: đối xứng qua trục ngang) Qui tắc đánh dấu ôđối xứng trục: Mỗi hàng, cột hình vuông nhỏ kí hiệumỗi loại Ví dụ với n=6, hàng, cột có dấu X, dấu | và1 dấu _ Sau lấy đối xứng qua trục đứng, trục ngang dấu | _ Sau điền giốngnhư cách nói trên, nhớ có số đối xứng theo trụcngang trục đứng Với ma trận dấu hoàn tất maphương cách dễ dàng: Chương trìnhcon để tạo ma trận dấu: procedure DanhDau; var n2,n3,k,x:integer; begin n2:=ndiv 2; n3:=n2div 2; j:=0; fillchar(dau,sizeof(dau),''); fori:=1 to n2 begin fork:=1 to n3 begin x:=(j+k-1)mod n2 +1; dau[i,x]:='x'; dau[i,n-x+1]:='x'; dau[n-i+1,x]:='x'; dau[n-i+1,n-x+1]:='x'; end; inc(j); end; if nmod 0 then begin j:=n3;k:=n3+1; fori:=1 to n2 begin j:=jmod n2 +1; dau[i,j]:='|'; dau[i,n-j+1]:='|'; k:=kmod n2 +1; dau[i,k]:='-'; dau[n-i+1,k]:='-'; end; end; end; Chương trìnhcon để điền số vào ma trận số để ma phương procedure DienSo; var dem:integer; begin dem:=1; fori:=1 to n forj:=1 to n begin casedau[i,j] of 'x':a[n-i+1,n-j+1]:=dem; '|':a[i,n-j+1]:=dem; '-':a[n-i+1,j]:=dem; '': a[i,j]:=dem; end; inc(dem); end; end; Lưu ý:Thuật toán áp dụng cho dãy số tăng dần VD: dãy cácsố chẵn, số lẻ Bạn thử xem! Phầncòn lại viết chương trình để xử lý chương trình xindành cho bạn Chào tạm biệt chúc thành công ... phương bậc bạn thu kếtquả sau Tôi nghĩ việc làm chương trình để giải ma phương bậc lẻ việc khôngkhó phải không Procedure MaPhuongLe; vardem:integer; luui,luuj:integer; begin fillchar(a,sizeof(a),0);... cách nói trên, nhớ có số đối xứng theo trụcngang trục đứng Với ma trận dấu hoàn tất maphương cách dễ dàng: Chương trìnhcon để tạo ma trận dấu: procedure DanhDau; var n2,n3,k,x:integer; begin n2:=ndiv... vi tính ta phải mở rộng ma trận vànhư tốn nhớ Ta phải làm với ô không chứa số Quả mộtlượng nhớ lớn không sử dụng cách đáng giá phải không nàoTôi xin trình bày cách giải ma phương lẻ mà không cần

Ngày đăng: 06/07/2017, 14:20

TỪ KHÓA LIÊN QUAN

w