PDA

View Full Version : Nhờ giúp đỡ về thuật toán có liên quan đến mà trận



vanquyenhp
31-03-2010, 12:10
Mình được rao một bài tập mà nghĩ mãi không ra, mong các bạn giúp đỡ
Đề bài: Nhập vào một số n (n là kích thước của một ma trận vuông) và nhập các phần tử cho ma trận đó. Hãy xây dựng thuật toán để in ma trận ra màn hình với điều kiện mà trận in ra phải là ma trận hình xoáy chôn ốc
Ví dụ về ma trận xoáy trôn ốc


1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

Mong các bạn giúp đỡ
Thanks!!!!!!!!!!!!!!!!

levanphong7887
01-04-2010, 11:13
Ma trận in ra theo thứ tự tăng dần (dọc theo đường xoắn ốc) của các phần tử nhập vào phải ko bạn?
mình ko hiểu rõ đề bài lắm.Bạn nên cho 1 ví dụ cụ thể.
Ví dụ ta nhập vào n=3, sau đó nhập lần lượt các giá trị ma trận là:
1 6 9 50 12 56 77 33 22
thì kết quả xuấ ra màn hình là gì?

anh2604
01-04-2010, 22:09
bài này khủng, nhai hơi vất, nhìn mãi hok thấy qui luật j hết. hjx, bạn lấy bài tập này ở đâu vậy. nếu dùng tọa độ định vị còn có khả năng, chứ không dùng tọa độ nhìn hok ra qui luật, mà tọa độ cũng hok khác mấy, nhai vất

osamabiladen
01-04-2010, 22:21
mình chịu thui
mình còn chưa hình dung cái ma trận ấy ntn nữa
hix....................

nam_long
01-04-2010, 22:24
Mình được rao một bài tập mà nghĩ mãi không ra, mong các bạn giúp đỡ
Đề bài: Nhập vào một số n (n là kích thước của một ma trận vuông) và nhập các phần tử cho ma trận đó. Hãy xây dựng thuật toán để in ma trận ra màn hình với điều kiện mà trận in ra phải là ma trận hình xoáy chôn ốc
Ví dụ về ma trận xoáy trôn ốc


1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

Mong các bạn giúp đỡ
Thanks!!!!!!!!!!!!!!!!
Chắc bạn phải lấy ví dụ khác có cả số có 3, 4 chữ số cho các bạn còn tìm ra quy luật chứ.

anh2604
01-04-2010, 22:48
ai làm được rồi post lên mọi người tham khảo, aj mà tự làm được bài này, hok hỏi thầy cô, hok hỏi aj hết, thì mình rất ngưỡng mộ, nếu hok aj giải được có lẽ đây là bài hok lời giải

vanquyenhp
01-04-2010, 23:46
Mà trận là như thế này
Nhập vào n là kích thước của ma trận vuông, VD n=3 thì có 3 hàng,3 cột;n=4 thì có 4 hàng, 4 cột.
Sau đó nhập vào các phần tử của ma trận đó. Ví dụ n=3 (3 hàng, 3 cột) thì có 9 phần tử, ví dụ các phần tử của ma trận 1,3,4,5,6,7,9,22,33


1 3 4
22 33 5
9 7 6

levanphong7887
02-04-2010, 10:50
Đầu tiên ta ánh xạ mỗi phần tử của ma trận cho tập chỉ số index {1,2,3...,n^2}. theo thứ tự tăng dần (phần tử nhỏ nhất có index là 1 và phần tử lớn nhất có index là n^2). Như vậy lúc này ta chỉ đơn giản là làm việc trên các index từ 1 đến n^2.
-hàng đầu tiên: in lần lượt các phần tử có index từ 1 đến n.
-hành cuối cùng: in lần lượt các phần tử có index từ 3n-2 đến 2n-1.
*khó là các hàng thứ 2 đến thứ n-1. Làm theo quy luật sau:
- Các phần tử đầu tiên của các hàng này có index là: Index(a[i][0])=4n-3-i (i=1,2,...,n-2).
- Các phần tử tiếp theo của các hàng này (trừ phần tử cuối)sẽ có index tăng dần:
Index(a[i][j])=Index(a[i][j-1])+1 (i=1,2...,n-2 và j=1,2...,n-2).
- Phần tử cuối của các hàng này có index là: Index(a[i][n-1])=n+i (i=1,2,...,n-2).

Đó là quy luật, mọi người cứ theo đó rồi tạo các vòng for tương ứng sẽ ok. Good Luck!
-

anh2604
02-04-2010, 11:34
hi! nhìn qua thì đúng được 80%, nhưng như thế vẫn sai bạn ơi
ví dụ.
---------------------------
01....02....03....04....05
16....17....18....19....06
15....24....25....20....07
14....23....22....21....08
13....12....11....10....09
----------------------------
làm theo thuật toán như vậy hàng thứ 4 sẽ sai. như vậy bạn làm vẫn là điểm 0, chúc mừng bạn.
có aj có thuật toán bài ny` hok, mình bức xúc quá, hok giải đc bài ny`

[=========> Bổ sung bài viết <=========]

ak`. đúng oy`, mình sẽ thêm vào thuật toán của bạn kia là:
từ các dòng thứ 0 đến i( với i = n/2 nếu chẵn, i = (n+1)/2) thì index tăng dân như bạn đã nói, nhưng từ i+1 đến n-1 thì thay vì tăng dần chúng ta cho index giảm dần, vậy là ok, hihi. bài ny` kết thúc/

[=========> Bổ sung bài viết <=========]

hjx, nhầm thế cũng không được nhìn thấy hàng thứ 3 bik là sai nữa rồi,
vẫn chưa xong bài ny`

levanphong7887
02-04-2010, 16:12
ok mình nhầm tí bạn.
Bạn giai theo ý tưởng này.
Bạn để ý thấy rằng nếu ma trận xoắn ốc cấp n, khi ta bỏ các giá trị bên ngoài viền của nó thì ta lại được 1 ma trận xoắn ốc cấp n-2. (Ý tưởng đệ quy ở đây rùi hii).
Sau đây là code mình viết bằng C, chạy rất tốt, mình test rồi, bạn lấy mà tham khảo.
#include<conio.h>
#include<iostream>
using namespace std;
int n_max;
int* index_matrix; /*ma tran chua cac index dung thu tu=> chi can in ra ma tran index nay*/
void tinh_index_matrix(int start_i,int start_j,int start_index, int n)
{
if(n==1)
{
index_matrix[start_i*n_max+start_j]=start_index;
return;
}
else if(n==2)
{
index_matrix[start_i*n_max+start_j]=start_index;
index_matrix[start_i*n_max+start_j+1]=start_index+1;
index_matrix[(start_i+1)*n_max+start_j]=start_index+3;
index_matrix[(start_i+1)*n_max+start_j+1]=start_index+2;
return;
}
else if(n<1)
return;

//gan cho cac vien ngoai cua index_matran

/*for(int j=0;j<n;j++) //gan cho cac vien ngoai cua index_matran
index_matrix[start_i][j+start_j]=start_index+j; //vien ben tren
for(j=1;j<n;j++)
index_matrix[start_i+j][start_j+n-1]=index_matrix[start_i][start_j+n-1]+j; //vien ben phai
for(j=0;j<n-1;j++)
index_matrix[start_i+n-1][start_j+j]=index_matrix[start_i+n-1][start_j+n-1]+n-1-j; //vien ben duoi
for(j=1;j<n-1;j++)
index_matrix[start_i+j][start_j]=index_matrix[start_i+n-1][start_j]+n-1-j; //vien ben trai
*/
//doan comment tren quy doi ra nhu code ben duoi

for(int j=0;j<n;j++)
index_matrix[start_i*n_max+j+start_j]=start_index+j; //vien ben tren
for(j=1;j<n;j++)
index_matrix[(start_i+j)*n_max+start_j+n-1]=index_matrix[start_i*n_max+start_j+n-1]+j; //vien ben phai
for(j=0;j<n-1;j++)
index_matrix[(start_i+n-1)*n_max+start_j+j]=index_matrix[(start_i+n-1)*n_max+start_j+n-1]+n-1-j; //vien ben duoi
for(j=1;j<n-1;j++)
index_matrix[(start_i+j)*n_max+start_j]=index_matrix[(start_i+n-1)*n_max+start_j]+n-1-j; //vien ben trai

int start_index_new=4*n-4+start_index;
tinh_index_matrix(start_i+1,start_j+1,start_index_ new,n-2);
}

void main()
{
char tl;
do
{
cout<<"nhap vao n=";
cin>>n_max;
int m=n_max*n_max;
index_matrix=new int[m];
tinh_index_matrix(0,0,1,n_max) ;

for(int i=0;i<n_max;i++) //moi hang
{
for (int j=0;j<n_max;j++)
cout<<index_matrix[i*n_max+j]<<"\t";
cout<<"\n";
}
cout<<"ban co muon tiep tuc ko?(Y/N)"<<endl;
cin>>tl;
}
while((tl!='k')&&(tl!='k'));
}

Yêu cầu nhập vào n rồi sẽ in ra ma trận xoắn ốc theo thứ tự các index tăng dần từ 1 đến n^2.
Ý tưởng là hàm:
void tinh_index_matrix(int start_i,int start_j,int start_index, int n);
sẽ gán các giá trị index {1,2...n^2} vào các vị trí tương ứng của mảng index_matrix. Rồi hàm main() chỉ việc print ra các giá trị trong mảng index_matrix đó.
*ý nghĩa của các đối số:
+int start_i và int start_j : xác định vị trí bắt đầu của ma trận con cấp (n-2) ứng với mảng index_matrix.
+int start_index: index đầu tiên của ma trận con.
+int n: Ma trận vuông cấp n.


Bạn cần phải làm thêm 1 công việc là ánh xạ các giá trị index trong mảng index_matrix vào các giá trị thực mà người dùng nhập cho ma trận, rùi in ma trận đó ra là ok.

anh2604
02-04-2010, 16:43
hình như tâm trạng bạn hok được tốt nên đọc câu ý hok được hay, sorry, hãy đọc cấu đó với giọng điệu hài hước bạn nhé!

ducspkt18
10-10-2010, 09:52
mình có một bài tập suy nghĩ mãi không ra mong các anh chị trên diễn đàn giúp đỡ
đề bài như sau: Xây dựng chuơng trình nhập vào một dãy ma trận cùng cấp n,sau đó tính tổng các ma trận đó

taimuinuong
10-12-2019, 16:24
Mình được rao một bài tập mà nghĩ mãi không ra, mong các bạn giúp đỡ
Đề bài: Nhập vào một số n (n là kích thước của một ma trận vuông) và nhập các phần tử cho ma trận đó. Hãy xây dựng thuật toán để in ma trận ra màn hình với điều kiện mà trận in ra phải là ma trận hình xoáy chôn ốc
Ví dụ về ma trận xoáy trôn ốc


1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

Mong các bạn giúp đỡ
Thanks!!!!!!!!!!!!!!!!

{xoan octheo chieu kim dong ho voi n hang, m cot}
Var A:Array[1..50,1..50] of integer;
i,j,k,n,m:integer;
BEGIN
Write('Nhap so hang va so cot :');Readln(n,m);
k:=0; i:=1;
Repeat
For j:=i to m+1-i do begin inc(k);A[i,j]:=k;end; {sang phai}
if k=n*m then Break;
For i:=m+2-j to n-m+j do begin inc(k);A[i,j]:=k;end; {di xuong}
if k=n*m then Break;
For j:=i+m-n-1 downto n+1-i do begin inc(k);A[i,j]:=k;end; {sang trai}
if k=n*m then Break;
For i:=n -j downto j+1 do begin inc(k);A[i,j]:=k;end; {di len}
if k=n*m then Break;
Until k=n*m;

{---Viet ra mang A---}
For i:=1 to n do
Begin
for j:=1 to m do Write(A[i,j]:3);
Writeln;
end;
END.
══════ 10:1 ═════◄■▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒►─