01/10/2018, 14:42
Ma trận xoắn ốc
Các tiền bối kiểm tra giúp em xem em sai chỗ nào mà chạy toàn ko ra đúng kết quả. Em cảm ơn.
Code:

#include <iostream>
using namespace std;
int main()
{
int mxn,r=0,m,n,x=0,y=0;
cin >> m >> n;
mxn=m*n;
int a[m][n],u=m,v=n;
while (r!=mxn)
{
for(int i=y;i<n;i++)
{r++; a[x][i]=r;}
x++;
for(int i=x;i<m;i++)
{r++; a[i][n]=r;}
n--;
for(int i=n-1;i>=y;i--)
{r++; a[m][i]=r;}
m--;
for(int i=m-1;i>=x;i--)
{r++; a[i][y]=r;}
y++;
}
for(int i=0;i<u;i++)
{
for(int j=0;j<v;j++) cout << a[i][j] << ' ';
cout << endl;
}
return 0;
}
Bài liên quan
đề bài là in ma trận cỡ mxn theo dạng xoắn ốc, có ví dụ ma trận 5x5 mà.
Ý tưởng cho bài này là nạp số theo vòng đầu của ma trận mxn, nạp hết vòng đầu thì coi việc nạp vòng bên trong là nạp vòng của ma trận (m-i)x(n-i).
nạp số theo vòng có 4 trường hợp:
TH1: nạp từ trái sang phải
TH2: nạp từ trên xuống
TH3 nạp từ phải sang trái
TH4: nạp từ dưới lên
Để biết nạp theo trường hợp nào thì ta cho các cạnh phải r, trái l, trên t, dưới b.
r=0;
mt[i][j]=++r;
TH1: i==t, j<r => j++
TH2: j==r; i<b => i++
TH3: i==b;j>l => j–
TH4 j==l; i>t => i–
int r=0;
int main(){
int m,n;
std::cin>>m>>n;
int mt[m][n];
int k=0;
int i=0,j=0;
int l=0,t=0,r=n,b=m;
int flag=1;
}