seaairland

 

经典矩阵问题

经典矩形问题
生成各种矩阵是竞赛时经常考的一种题目,如何用C语言或C++生成以下形式几种矩阵:

第一种矩阵:

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


第二种矩阵:(蛇形)

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


第三种矩阵:

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


第四种矩阵:

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


规律提示:

1.1->2 9->10
4<-3 8 11
5->6->7 12
16<-15<-14<-13
2.每个左上三角的数都是连续的
3.一个回旋阵,从外到里是连续的。
4.同样是回旋,从里到外是连续的。

 

第一种矩阵算法:

#include<iostream.h>
#include<iomanip.h>

void main()
{
const int N=20;
int i=0,j=0,a[N][N];
int lap=1,m=1,n;
while(1)
{
cout<<"\ninput matrix row N(N>=2): ";
cin>>n;
cout<<endl;
if(n>=2) break;
}
a[i][j]=m++;
lap++;
while(lap<=n)
{
if(lap%2==0)
{
for(j++;i<lap;i++)
a[i][j]=m++;i--;
for(j--;j>=0;j--)
a[i][j]=m++;j++;
}
else
{
for(i++;j<lap;j++)
a[i][j]=m++;j--;
for(i--;i>=0;i--)
a[i][j]=m++;i++;
}
lap++;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<setw(4)<<setiosflags(ios::left)<<a[i][j];
cout<<endl;
}
cout<<endl;
}


第二种矩阵算法:(蛇形)

#include<iostream.h>
#include<iomanip.h>

void main()
{
const int MAXLEN=10;
int nLen;
int nSnake[MAXLEN][MAXLEN];
do
{
cout<<"\ninput an integer less then "<<MAXLEN<<": ";
cin>>nLen;
cout<<endl;
}while(nLen>MAXLEN);
int i=0,j=0,s=1,nNum=1;
//s标记升降方向,斜向上为升(s==1),斜向下为降(s==-1)
while(1)
{
if(s==1)
{
nSnake[i][j]=nNum;
if(i-1<0)
{
if(j+1==nLen)
i++;
else
j++;
s=-1;
}
else
if(j+1==nLen)
{
i++;
s=-1;
}
else
{
i--;
j++;
}
}
else
{
nSnake[i][j]=nNum;
if(j-1<0)
{
if(i+1==nLen)
j++;
else
i++;
s=1;
}
else
if(i+1==nLen)
{
j++;
s=1;
}
else
{
i++;
j--;
}
}
nNum++;
if(nNum>nLen*nLen)
break;
}
for(i=0;i<nLen;i++)
{
for(j=0;j<nLen;j++)
cout<<setw(4)<<setiosflags(ios::left)<<nSnake[i][j];
cout<<endl;
}
cout<<endl;
}


第三种矩阵算法:

#include<iostream.h>
#include<iomanip.h>

void main()
{
const int N=20;
int i=0,j=0,a[N][N],n;
int m=1,x1,x2,y1,y2,s=1;
//x1,x2,y1,y2为上、下、左、右边界
//s标记数组元素升降,s==1为升,s==-1为降
while(1)
{
cout<<"\ninput matrix row N(N>=2): ";
cin>>n;
cout<<endl;
if(n>=2)
break;
}
x1=0;y1=0;x2=n;y2=n;
while(1)
{
if(s==1)
{
for(j;j<y2;j++)
a[i][j]=m++;
j--;i++;y2--;
for(i;i<x2;i++)
a[i][j]=m++;
i--;j--;x2--;
s=-1;
}
else
{
for(j;j>=y1;j--)
a[i][j]=m++;
j++;i--;y1++;
for(i;i>=x1+1;i--)
a[i][j]=m++;
i++;j++;x1++;
s=1;
}
if(m>n*n)
break;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<setw(4)<<setiosflags(ios::left)<<a[i][j];
cout<<endl;
}
cout<<endl;
}


第四种矩阵算法:

#include<iostream.h>
#include<iomanip.h>

void main()
{
const int N=20;
int i=0,j=0,a[N][N],n;
int m,x1,x2,y1,y2,s;
//x1,x2,y1,y2为上、下、左、右边界
//s标记数组元素升降,s==1为升,s==-1为降
while(1)
{
cout<<"\ninput matrix row N(N>=2): ";
cin>>n;
cout<<endl;
if(n>=2)
break;
}
m=n*n;
x1=0;y1=0;x2=n;y2=n;
if(n%2==0)
{j=n-1;y2=n-1;s=1;}
else
{i=n-1;y1=1;s=-1;}
while(1)
{
if(s==1)
{
for(i;i<x2;i++)
a[i][j]=m--;
i--;j--;x2--;
for(j;j>=y1;j--)
a[i][j]=m--;
j++;i--;y1++;
s=-1;
}
else
{
for(i;i>=x1;i--)
a[i][j]=m--;
i++;j++;x1++;
for(j;j<y2;j++)
a[i][j]=m--;
j--;i++;y2--;
s=1;
}
if(m<1)
break;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<setw(4)<<setiosflags(ios::left)<<a[i][j];
cout<<endl;
}
cout<<endl;
}

 

posted on 2006-04-03 16:08 chenhui 阅读(705) 评论(0)  编辑  收藏 所属分类: 好文收集


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

介绍 IOC

友情链接

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜