| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1334 人关注过本帖
标题:[讨论]矩阵题,intereting
取消只看楼主 加入收藏
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
结帖率:66.67%
收藏
 问题点数:0 回复次数:2 
[讨论]矩阵题,intereting

生成各种矩阵是竞赛时经常考的一种题目,如何用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.同样是回旋,从里到外是连续的。

大家先说明做哪个矩阵再贴算法。

搜索更多相关主题的帖子: intereting 矩阵 
2004-07-26 16:36
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

第一种矩阵算法:

#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; }

2004-07-27 12:40
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

输入一个数(这里以3为例)打印以下距阵(回字矩阵):

1 1 1 1 1 1 1 2 2 2 2 1 1 2 3 3 2 1 1 2 3 3 2 1 1 2 2 2 2 1 1 1 1 1 1 1

#include<iostream.h> #include<iomanip.h> void main() { int n,a,b,i,j; cout<<"\ninput the number of the laps: "; cin>>n; cout<<endl; for(i=1;i<=2*n;i++) { for(j=1;j<=2*n;j++) { a=i>n?(2*n+1-i):i; b=j>n?(2*n+1-j):j; cout<<setw(3)<<(a=(a<b)?a:b); } cout<<'\n'; } cout<<endl; }

以1 1 1 1为例,分成两部分: 1 1 1 1 1 1 2 2 1 2 1 1 2 2 1 2 2 1 2 2 1 1 2 1 1 1 1 1 1 1 1 1

对应的数组坐标为: (0,3) (0,0)(0,1)(0,2)(0,3) (1,2)(1,3) (1,0)(1,1)(1,2) (2,1)(2,2)(2,3) (2,0)(2,1) (3,0)(3,1)(3,2)(3,3) (3,0)

对应的判断为: if((i+j)>=m) if((i+j)<=m)

a[i][j]=(i>=j)?(m-i):(m-j); a[i][j]=(i<=j)?(i+1):(j+1);

这样就可以确定赋值给上半边还是下半边了!

接下来的问题就是打印输出了!

if(j==(m-1)) cout<<endl;

2004-07-27 12:41
快速回复:[讨论]矩阵题,intereting
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012386 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved