可达矩阵快速算法_第1页
可达矩阵快速算法_第2页
可达矩阵快速算法_第3页
可达矩阵快速算法_第4页
可达矩阵快速算法_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

可达矩阵快速算法(完整版)实用资料(可以直接使用,可编辑完整版实用资料,欢迎下载)

传递闭包Warshall方法计算可达矩阵简要介绍①在集合X上的二元关系R的传递闭包是包含R的X上的最小的传递关系。R的传递闭包在数字图像处理的图像和视觉基础、图的连通性描述等方面都是基本概念。一般用B表示定义在具有n个元素的集合X上关系R的n×n二值矩阵,则传递闭包的矩阵B+可如下计算:B+=可达矩阵快速算法(完整版)实用资料(可以直接使用,可编辑完整版实用资料,欢迎下载)B+B2+B3+……+(B)n②式中矩阵运算时所有乘法都用逻辑与代替,所有加法都用逻辑或代替。上式中的操作次序为B,B(B),B(BB),B(BBB),……,所以在运算的每一步我们只需简单地把现有结果乘以B,完成矩阵的n次乘法即可。://93337/ism/cal_warshall_get_r_mat_detail.phpWarshall在1962年提出了一个求关系的传递闭包的有效算法。其具体过程如下,设在n个元素的有限集上关系R的关系矩阵为M:(1)置新矩阵A=M;(2)置k=1;(3)对所有i如果A[i,k]=1,则对j=1..n执行:A[i,j]←A[i,j]∨A[k,j];(4)k增1;(5)如果k≤n,则转到步骤(3),否则停止。所得的矩阵A即为关系R的传递闭包t(R)的关系矩阵。在《离散数学》中都提及了该算法。Warshall算法映射到有向图中设关系R的关系图为G,设图G的所有顶点为u1,u2,…,un,则t(R)的关系图可用该方法得到:若G中任意两顶点ui和uj之间有一条路径且没有ui到uj的弧,则在图G中增加一条从ui到uj的弧,将这样改造后的图记为G’,则G’即为t(R)的关系图。G’的邻接矩阵A应满足:若图G中存在从ui到uj路径,即ui与uj连通,则A[i,j]=1,否则A[i,j]=0。这样,求t(R)的问题就变为求图G中每一对顶点间是否连通的问题。相乘矩阵,就为所有节点的关系图,也就是当前条件下的关系矩阵。对于相乘矩阵,进行叠代,叠代的过程为,行取值,然后计算值中对应的每一行的值取并集,得到当前行的关系集合。取完所有行,得到了一个新的转移矩阵再对转移矩阵进行进行求解。Warshall的叠代次数比逐次平方法的运行效率要高。如果图中的顶点是有序的排列,只要进行一次Warshall运算就可以获得可达矩阵。您输入原始矩阵matrix_A为一个方阵结果如下第1次迭代当前0号要素a的可达集合(b,f,a)1号要素b的可达集合c,e,b5号要素f的可达集合c,f0号要素a的可达集合b,f,a当前0号要素a的可达集合(b,f,a,c,e)当前1号要素b的可达集合(c,e,b)2号要素c的可达集合b,c4号要素e的可达集合f,e1号要素b的可达集合c,e,b当前1号要素b的可达集合(c,e,b,f)当前2号要素c的可达集合(b,c)1号要素b的可达集合c,e,b,f2号要素c的可达集合b,c当前2号要素c的可达集合(b,c,e,f)当前3号要素d的可达集合(a,d)0号要素a的可达集合b,f,a,c,e3号要素d的可达集合a,d当前3号要素d的可达集合(a,d,b,f,c,e)当前4号要素e的可达集合(f,e)5号要素f的可达集合c,f4号要素e的可达集合f,e当前4号要素e的可达集合(f,e,c)当前5号要素f的可达集合(c,f)2号要素c的可达集合b,c,e,f5号要素f的可达集合c,f当前5号要素f的可达集合(c,f,b,e)当前6号要素g的可达集合(b,g)1号要素b的可达集合c,e,b,f6号要素g的可达集合b,g当前6号要素g的可达集合(b,g,c,e,f)第1次迭代得到的转移矩阵如下:第2次迭代当前0号要素a的可达集合(b,f,a,c,e)1号要素b的可达集合c,e,b,f5号要素f的可达集合c,f,b,e0号要素a的可达集合b,f,a,c,e2号要素c的可达集合b,c,e,f4号要素e的可达集合f,e,c当前0号要素a的可达集合(b,f,a,c,e)当前1号要素b的可达集合(c,e,b,f)2号要素c的可达集合b,c,e,f4号要素e的可达集合f,e,c1号要素b的可达集合c,e,b,f5号要素f的可达集合c,f,b,e当前1号要素b的可达集合(c,e,b,f)当前2号要素c的可达集合(b,c,e,f)1号要素b的可达集合c,e,b,f2号要素c的可达集合b,c,e,f4号要素e的可达集合f,e,c5号要素f的可达集合c,f,b,e当前2号要素c的可达集合(b,c,e,f)当前3号要素d的可达集合(a,d,b,f,c,e)0号要素a的可达集合b,f,a,c,e3号要素d的可达集合a,d,b,f,c,e1号要素b的可达集合c,e,b,f5号要素f的可达集合c,f,b,e2号要素c的可达集合b,c,e,f4号要素e的可达集合f,e,c当前3号要素d的可达集合(a,d,b,f,c,e)当前4号要素e的可达集合(f,e,c)5号要素f的可达集合c,f,b,e4号要素e的可达集合f,e,c2号要素c的可达集合b,c,e,f当前4号要素e的可达集合(f,e,c,b)当前5号要素f的可达集合(c,f,b,e)2号要素c的可达集合b,c,e,f5号要素f的可达集合c,f,b,e1号要素b的可达集合c,e,b,f4号要素e的可达集合f,e,c,b当前5号要素f的可达集合(c,f,b,e)当前6号要素g的可达集合(b,g,c,e,f)1号要素b的可达集合c,e,b,f6号要素g的可达集合b,g,c,e,f2号要素c的可达集合b,c,e,f4号要素e的可达集合f,e,c,b5号要素f的可达集合c,f,b,e当前6号要素g的可达集合(b,g,c,e,f)第2次迭代得到的转移矩阵如下:第3次迭代当前0号要素a的可达集合(b,f,a,c,e)1号要素b的可达集合c,e,b,f5号要素f的可达集合c,f,b,e0号要素a的可达集合b,f,a,c,e2号要素c的可达集合b,c,e,f4号要素e的可达集合f,e,c,b当前0号要素a的可达集合(b,f,a,c,e)当前1号要素b的可达集合(c,e,b,f)2号要素c的可达集合b,c,e,f4号要素e的可达集合f,e,c,b1号要素b的可达集合c,e,b,f5号要素f的可达集合c,f,b,e当前1号要素b的可达集合(c,e,b,f)当前2号要素c的可达集合(b,c,e,f)1号要素b的可达集合c,e,b,f2号要素c的可达集合b,c,e,f4号要素e的可达集合f,e,c,b5号要素f的可达集合c,f,b,e当前2号要素c的可达集合(b,c,e,f)当前3号要素d的可达集合(a,d,b,f,c,e)0号要素a的可达集合b,f,a,c,e3号要素d的可达集合a,d,b,f,c,e1号要素b的可达集合c,e,b,f5号要素f的可达集合c,f,b,e2号要素c的可达集合b,c,e,f4号要素e的可达集合f,e,c,b当前3号要素d的可达集合(a,d,b,f,c,e)当前4号要素e的可达集合(f,e,c,b)5号要素f的可达集合c,f,b,e4号要素e的可达集合f,e,c,b2号要素c的可达集合b,c,e,f1号要素b的可达集合c,e,b,f当前4号要素e的可达集合(f,e,c,b)当前5号要素f的可达集合(c,f,b,e)2号要素c的可达集合b,c,e,f5号要素f的可达集合c,f,b,e1号要素b的可达集合c,e,b,f4号要素e的可达集合f,e,c,b当前5号要素f的可达集合(c,f,b,e)当前6号要素g的可达集合(b,g,c,e,f)1号要素b的可达集合c,e,b,f6号要素g的可达集合b,g,c,e,f2号要素c的可达集合b,c,e,f4号要素e的可达集合f,e,c,b5号要素f的可达集合c,f,b,e当前6号要素g的可达集合(b,g,c,e,f)第3次迭代得到的转移矩阵如下:VisualC++技术交流汇《螺旋矩阵》群号:1、927821472、874231913、1262095221、我早期写的螺旋矩阵#include<stdio.h>#include<stdlib.h>#include<math.h>voidmain(){ intNum,Count[20]={0},k=1,i,Sum,j,Member[10][10]={0},Mod=3,Line; intRow=0,Column=-1,f,x,y,Value=0; printf("请输入一个不大于10的数:"); scanf("%d",&Num); f=Num; Sum=(Num-1)*2+1; Count[0]=Num; do { Num--; for(i=0;i<2;i++)Count[k++]=Num; } while(Num>1); for(i=0;i<Sum;i++) { Line=++Mod%4; for(j=0;j<Count[i];j++) { Value++; switch(Line) { case0: Column++; Member[Row][Column]=Value; break; case1: Row++; Member[Row][Column]=Value; break; case2: Column--; Member[Row][Column]=Value; break; case3: Row--; Member[Row][Column]=Value; break; default: break; } } } for(x=0;x<f;x++) { for(y=0;y<f;y++) printf("%d\t",Member[x][y]); printf("\n"); }}2、网上普遍的螺旋矩阵#include<stdio.h>#defineN8main(){ inti,j,n=1,a[N][N]; for(i=0;i<=N/2;i++) { for(j=i;j<N-i;j++) a[i][j]=n++; for(j=i+1;j<N-i;j++) a[j][N-i-1]=n++; for(j=N-i-2;j>i;j--) a[N-i-1][j]=n++; for(j=N-i-1;j>i;j--) a[j][i]=n++; } for(i=0;i<N;i++) { printf("\n\n"); for(j=0;j<N;j++) printf("%5d",a[i][j]); }}3、██刮開<85220214@qq>的螺旋矩阵//luoxuanjuzheng.cpp:Definestheentrypointfortheconsoleapplication.//#include<stdafx.h>#include<iostream>#include<stdio.h>#defineLength11//改变这里的值来改变矩阵的大小注意:要多出两列两行0方便写算法usingnamespacestd;typedefstructelement{ intdata;intfangxiang;//东1南2西3北0;boolisfill;//记录是否已被填数用于确定转弯方向 introw; intcol;};intiShuzhi=1;intmain(intargc,char*argv[]){ voiddisplay(elementa[][Length]); voidinit(elementa[][Length]);elementfillnext(elementa[][Length],elementx);//填充下个元素 elementa[Length][Length],x; init(a); inti=0; x=fillnext(a,a[1][1]); while(i<((Length-2)*(Length-2))-2)//调用函数的次数(n*n-2)次因为上面已经调用一次 { x=fillnext(a,x); i++; } display(a); system("pause"); return0;}voidinit(elementa[][Length])//初始化{ inti,j; for(i=0;i<Length;i++) { for(j=0;j<Length;j++) { if(i==0||j==0||i==Length-1||j==Length-1) { a[i][j].data=0; } a[i][j].isfill=false; a[i][j].row=i; a[i][j].col=j; } } a[1][1].data=iShuzhi; a[1][1].fangxiang=1; a[1][1].isfill=true;}voiddisplay(elementa[][Length]){ inti,j; for(i=0;i<Length;i++) { for(j=0;j<Length;j++) { printf("%2d",a[i][j].data); } cout<<endl; }}elementfillnext(elementa[][Length],elementx){ if(x.fangxiang==1) { if(a[x.row][x.col+1].data!=0&&a[x.row][x.col+1].isfill==false) { a[x.row][x.col+1].data=++iShuzhi; a[x.row][x.col+1].fangxiang=1; a[x.row][x.col+1].isfill=true; returna[x.row][x.col+1]; } elseif(a[x.row][x.col+1].data==0||a[x.row][x.col+1].isfill==true)//用于转向当碰到0或者前面已被数据填充时转向 { x.fangxiang=(x.fangxiang+1)%4; returnfillnext(a,x); } } if(x.fangxiang==2) { if(a[x.row+1][x.col].data!=0&&a[x.row+1][x.col].isfill==false) { a[x.row+1][x.col].data=++iShuzhi; a[x.row+1][x.col].fangxiang=2; a[x.row+1][x.col].isfill=true; returna[x.row+1][x.col]; } elseif(a[x.row+1][x.col].data==0||a[x.row+1][x.col].isfill==true) { x.fangxiang=(x.fangxiang+1)%4; returnfillnext(a,x); } } if(x.fangxiang==3) { if(a[x.row][x.col-1].data!=0&&a[x.row][x.col-1].isfill==false) { a[x.row][x.col-1].data=++iShuzhi; a[x.row][x.col-1].fangxiang=3; a[x.row][x.col-1].isfill=true; returna[x.row][x.col-1]; } elseif(a[x.row][x.col-1].data==0||a[x.row][x.col-1].isfill==true)//cuolebuxiaodezainaa { x.fangxiang=(x.fangxiang+1)%4; returnfillnext(a,x); } } if(x.fangxiang==0) { if(a[x.row-1][x.col].data!=0&&a[x.row-1][x.col].isfill==false) { a[x.row-1][x.col].data=++iShuzhi; a[x.row-1][x.col].fangxiang=0; a[x.row-1][x.col].isfill=true; returna[x.row-1][x.col]; } elseif(a[x.row-1][x.col].data==0||a[x.row-1][x.col].isfill==true) { x.fangxiang=(x.fangxiang+1)%4; returnfillnext(a,x); } } }4、#include<stdafx.h>#include<iostream>usingnamespacestd;voidmain(){//解题原理:按一个完整的框,从外往里一层层的填充值 constintx=9,y=9; intnum=1;//起始值¦ intdiv=0;//从外往里数层次 intarray[x][y]={0}; while(num<x*y+1) { for(intj=div;j<y-div;j++) { array[div][j]=num++; } for(inti=div+1;i<x-div;i++) { array[i][y-1-div]=num++; } for(intj=y-2-div;j>=div;j--) { array[x-1-div][j]=num++; } for(inti=x-2-div;i>div;i--) { array[i][div]=num++; } div+=1; }//输出 for(inti=0;i<x;i++) { for(intj=0;j<y;j++) { cout.width(3); cout.fill(''); cout<<array[i][j]; } cout<<endl; } system("pause");}5、神問<149116183@qq>的螺旋矩阵#include<stdafx.h>#include<iostream>#include<iomanip>usingnamespacestd;intmain(){ intn; while(1) { cout<<"Inputlines(0<line<16):"; cin>>n; if(n>0&&n<16) break; else { cout<<"Inputerror!"<<endl; continue; } } inti,j;//定义行列循环变量 intk=0,z;//k初始化为0,k<=n*n intx=0,y=n;//定义行列范围 int**a; a=newint*[n]; for(i=0;i!=n;++i) a[i]=newint[n];//二维数组 a[0][0]=1; for(intp=0;p!=(n+1)/2;++p) { for(i=x,j=x;j!=y-1;++j);//向右+ a[i][j]=++k; for(i=x,j=y-1;i!=y-1;++i)//向下+ a[i][j]=++k; for(i=y-1,j=y-1;j!=x;--j)//向左+ a[i][j]=++k; for(i=y-1,j=x;i!=x;--i)//向上+ a[i][j]=++k; ++x; --y; z=k+1; } if(n%2)//当n为奇数时,中心数字为最后的k加1,也为初始k+n*n { a[n/2][n/2]=z; } for(i=0;i!=n;++i) { for(j=0;j!=n;++j) { cout<<setw(4)<<a[i][j]; } cout<<endl; cout<<endl; } for(i=0;i!=n;++i) deletea[i]; system("pause"); return0;}6、无所谓<cheng52364@qq>的螺旋矩阵#include<stdafx.h>#include<iostream>usingnamespacestd;intmain(){intn,m=1; inta[20][20]; cout<<"输入二维矩阵的阶n="; cin>>n;ints=0,x=0,k=0,p=0,i=0,j=0; introw=n,col=n;do{ if(x<(n+1)/2) { for(i=k;j<col;j++) a[i][j]=m++; row=col-1;s=k+1; for(j=row,i=s;i<col;i++)a[i][j]=m++; for(i=row,j=--row;j>=p;j--) a[i][j]=m++; for(j=p,i=row;i>s;i--)a[i][j]=m++; k++; p++; col--; x++; }}while(x<(n+1)/2); cout<<"输出的矩阵为"<<endl; for(i=0;i<n;i++) { for(j=0;j<n;j++) { cout.width(3);//固定宽度为3cout.fill('');//不足位填充空格 cout<<a[i][j]<<''; } cout<<endl; } system("pause"); return0;}7、姚博渊<254200341@qq>的螺旋矩阵a.cpp#include<iostream>#include"d.h"usingnamespacestd;intmain(){ArrayAlgorithmarray; array.Order(); array.Display(); system("pause"); return0;}b.hstructArrayData{ intItem; boolIsPlace;};enumDIRECTION{UP,DOWN,LEFT,RIGHT};classArrayAlgorithm{public: ArrayAlgorithm(); DIRECTIONGetDirection()const; voidSetDirection(DIRECTIONd); voidOrder(); voidDisplay(); ArrayDataData[9][9]; DIRECTIONDirection;};b.cpp#include<iostream>#include"d.h"usingnamespacestd;ArrayAlgorithm::ArrayAlgorithm(){ for(inti=0;i<9;i++) { for(intj=0;j<9;j++) { Data[i][j].IsPlace=false; Data[i][j].Item=0; } }}DIRECTIONArrayAlgorithm::GetDirection()const{ returnDirection;}voidArrayAlgorithm::SetDirection(DIRECTIONd){ Direction=d;}voidArrayAlgorithm::Order(){ intnum=0; inti=0,j=0; Direction=RIGHT; SetDirection(Direction); while(num<81) { num++; Data[i][j].Item=num; Data[i][j].IsPlace=true; switch(GetDirection()) { caseUP: if(i-1>=0) { if(!Data[i-1][j].IsPlace)//判断该方向的前驱位置是否已放置元素 { i--;Direction=UP; } else//否则转向,下同 { if(!Data[i][j+1].IsPlace) { j++; Direction=RIGHT; } else//已排序结束;跳出 break; } } else//原地不动,只转方向,值减1,转向后重新在该位置赋值 { num--; Direction=RIGHT; } break; caseDOWN: if(i+1<=8) { if(!Data[i+1][j].IsPlace)//判断该方向的前驱位置是否已放置元素 { i++;Direction=DOWN; } else { if(!Data[i][j-1].IsPlace) { j--; Direction=LEFT; } else//已结束;跳出 break; } } else { num--; Direction=LEFT; } break; caseLEFT: if(j-1>=0) { if(!Data[i][j-1].IsPlace)//判断该方向的前驱位置是否已放置元素 { j--;Direction=LEFT; } else { if(!Data[i-1][j].IsPlace) { i--; Direction=UP; } else//已结束;跳出 break; } } else { num--; Direction=UP; } break; caseRIGHT: if(j+1<=8) { if(!Data[i][j+1].IsPlace)//判断该方向的前驱位置是否已放置元素 { j++;Direction=RIGHT; } else { if(i+1<=8) { if(!Data[i+1][j].IsPlace) { i++; Direction=DOWN; } else break; } } } else { num--; Direction=DOWN; } break; } SetDirection(Direction); }}voidArrayAlgorithm::Display(){ for(inti=0;i<9;i++) { for(intj=0;j<9;j++) { if(Data[i][j].Item<10) cout<<Data[i][j].Item<<""; else cout<<Data[i][j].Item<<""; } cout<<endl; }}8、微微々草堂282750167的螺旋矩阵#include"stdafx.h"#include"iostream"usingnamespacestd;int_tmain(intargc,_TCHAR*argv[]){ intA[9][9]; inta,b,c,E,p,q; E=1; b=0; c=0; for(a=1;a<6;a++) { for(;c<9-a;c++,E++) A[b][c]=E; for(;b<9-a;b++,E++) A[b][c]=E; for(;c>a-1;c--,E++) A[b][c]=E; for(;b>a;b--,E++) A[b][c]=E; } A[4][4]=81; for(p=0;p<9;p++) { for(q=0;q<9;q++) cout<<A[p][q]<<""; cout<<endl; } system("pause"); return0;}9、范容谦<fanrqqq@foxmail>的螺旋矩阵#include"stdafx.h"#include"iostream"#include"string.h"usingnamespacestd;voidgivenum(int*p,intc,intd);intmain(){ inta[]={0,1,0,-1}; intb[]={1,0,-1,0}; inti,j;//数组 intx(0),y(0);//标定数组使用 intx1(0),y1(0);//计算下一个元素位置 intdx(0);//数组移动 cout<<"请输入数组的行数:"<<endl; cin>>i; cout<<"请输入数组的列数:"<<endl; cin>>j; intarr[20][20]; memset(arr,0,sizeof(arr)); intnum;//数组赋值使用 for(num=1;num<=i*j;num++) { arr[x][y]=num; x1=x+a[dx]; y1=y+b[dx]; if(y1>=j||x1>=i||y1<0||arr[x1][y1]) { dx++; if(dx>3) { dx=0; } } x+=a[dx]; y+=b[dx]; }//输出矩阵数组 for(intn=0;n<i;n++) { for(intk=0;k<j;k++) { if(arr[n][k]<10) { cout<<""<<arr[n][k]<<""; } else { cout<<arr[n][k]<<""; } } cout<<endl; } system("pause"); return0;}10、风痕<506520543@qq>的螺旋矩阵#include"stdafx.h"#include<iostream>#include<string.h>usingnamespacestd;intinitNum=1;//direction1向右,2向下,3向左,4向上//x横向位置,y纵向位置//nSub代表是缩进去几行几列//bool判断是否还继续boolJuZhen(int*arry[],intn,int&x,int&y,intdirection,intnSub){ if(arry[x][y]!=0||x<nSub||x>=n-nSub||y<nSub||y>=n-nSub) { returnfalse; } switch(direction) { //向右 case1: { for(;y<n-nSub;y++) { if(arry[x][y]==0) { arry[x][y]=initNum++; } else { break; } } x=x+1; y=y-1; returntrue; } //向下 case2: { for(;x<n-nSub;x++) { if(arry[x][y]==0) { arry[x][y]=initNum++; } else { break; } } x=x-1; y=y-1; returntrue; } //向左 case3: { for(;y>=nSub;y--) { if(arry[x][y]==0) { arry[x][y]=initNum++; } else { break; } } x=x-1; y=y+1; returntrue; } //向上 case4: { for(;x>=nSub;x--) { if(arry[x][y]==0) { arry[x][y]=initNum++; } else { break; } } x=x+1; y=y+1; returntrue; } } returntrue;}voidmain(){ int**arry; intn; intnSub; intx=0,y=0; while(true) { x=0; y=0; initNum=1; cout<<"输入矩阵大®小:"; cin>>n; cout<<"输入缩进数:"; cin>>nSub; if(nSub>n/2) { cout<<"缩进太多!!"<<endl; continue; } if(n<=0||nSub<0) { cout<<"谁让你输那么小的数了,不做!!"<<endl; break; } x=nSub; y=nSub; arry=newint*[n]; for(inti=0;i<n;i++) { arry[i]=newint[n]; memset(arry[i],0,n*sizeof(int)); } boolisGoOn=true; while(isGoOn) { //右 isGoOn=JuZhen(arry,n,x,y,1,nSub); //下 if(isGoOn) { isGoOn=JuZhen(arry,n,x,y,2,nSub); } //左 if(isGoOn) { isGoOn=JuZhen(arry,n,x,y,3,nSub); } //上 if(isGoOn) { isGoOn=JuZhen(arry,n,x,y,4,nSub); } } for(inti=0;i<n;i++) { for(intj=0;j<n;j++) { cout.width(4); cout<<arry[i][j]; } cout<<endl; } for(inti=0;i<n;i++) { deletearry[i]; } deletearry; }}11、の鈊oΟ痛こ<441528779@qq>的螺旋矩阵#include"stdafx.h"#include"iostream"#include"stdio.h"usingnamespacestd;voidmain(){ intjz[100][100];//初始图形 intk,y;//变形数组 intn;//二维矩阵的阶 cout<<"请输入二维矩阵的阶(小于等于100):"; cin>>n; intfx=0;//方向 inti=0,j=0;//数组下标: intsum=1;//矩阵中最大的数 while(sum<=n*n) { jz[i][j]=sum++; switch(fx) { case0: { j++; if(i+j==n-1) fx=1; break; } case1: { i++; if(i==j) fx=2; break; } case2: { j--; if(i+j==n-1) fx=3; break; } case3: { i--; if(i-j==1) fx=0; break; } }}intkj[102][102]={0};for(i=0;i<n;i++){ for(j=0;j<n;j++) { kj[i+1][j+1]=jz[i][j]; }}for(i=0;i<n+2;i++){ for(j=0;j<n+2;j++) { cout<<kj[i][j]<<"\t"; } cout<<"\n";}system("pause");}12、沧海一笑<1471192800@qq>的螺旋矩阵//算法是自己想出来的,代码愚笨,勿笑,^_^//#include<stdio.h>#include"stdafx.h"#include"iostream"#include<windows.h>usingnamespacestd;voidmain(){ intn; inti,j; intnum=1; intx; //x表示总循环的次数也就是数组有多少圈 inta[100][100]={0};// printf("请输入数组的维数:"); cout<<"请输入数组的维数:";// scanf("%i",&n); cin>>n; a[(n+1)/2][(n+1)/2]=n*n; //对数组的中心数字值赋值,若数组的维数为偶数,则所赋的值无效(被后面的赋值覆盖) for(x=1;x<=(n+1)/2;x++) //从外向内,一圈一圈的对数组进行赋值 { for(i=x;i<(n+1-x);i++) //从左上角到右上角 { a[x][i]=num; num++;f } for(i=x;i<(n+1-x);i++) //从右上角到右下角 { a[i][n+1-x]=num; num++; } for(i=(n+1-x);i>x;i--) //从右下角多左下角 { a[n+1-x][i]=num; num++; } for(i=n+1-x;i>x;i--) //从左下角到左上角(一圈完成) { a[i][x]=num; num++; } }//输出数组中的数字 for(i=1;i<=n;i++) { for(j=1;j<=n;j++) {// printf("%3i",a[i][j]); cout<<a[i][j]; }// printf("\n"); cout<<"\n"; } system("pause");}13、铅笔核心<125729328@qq>的螺旋矩阵#include"stdafx.h"#include<iostream>//螺旋矩阵顺序输入增值正数(可定制任意长宽)usingnamespacestd;voidmain(){intnum,x,y,a=0,b=0,h,cishu=0,o=1,luoxuan[15][15]={0};cout<<"使用实数输入矩阵的宽和高"<<endl;cin>>x>>y;cout<<"==========================================="<<endl;if(x>15||y>15||0>x||0>y)cout<<"螺旋矩阵宽高限制正数以内"<<endl;elsenum=x*y;while(cishu<num){for(h=1;h<=x-o;++h){if(cishu<num)luoxuan[a][b]=++cishu;a=++a;}if(num-cishu==1)luoxuan[a][b]=++cishu;for(h=1;h<=y-o;++h){if(cishu<num)luoxuan[a][b]=++cishu;b=++b;}for(h=1;h<=x-o;++h){if(cishu<num)luoxuan[a][b]=++cishu;a=--a;}for(h=1;h<=y-o;++h){if(cishu<num)luoxuan[a][b]=++cishu;b=--b;}a=++a;b=++b;o=o+2;}if(x>15||y>15||0>x||0>y);elsefor(intm=0;m<y;++m){for(intl=0;l<x;++l){cout<<luoxuan[l][m]<<'\t';}cout<<endl;} system("pause");}14、无心再战<110490858@qq>的螺旋矩阵/矩阵排序/#include"stdafx.h"#include<iostream>usingnamespacestd;constintNUM=81;constintMAX=80;inta[NUM];//获取数组元素输入voidGetArray();voidGetArray(){ cout<<"请输入数组元素"<<endl; for(inti=0;i<NUM;i++) { cout<<"这是第"<<i+1<<"个元素"<<endl; cin>>a[i]; }}//将数组按小到大排好顺序voidSortArray();voidSortArray(){ inttemp; for(inti=0;i<MAX;i++) { for(intj=0;j<MAX-i;j++) { if(a[j]>a[j+1]) { temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } }}//测试排序voidShow();voidShow(){ for(inti=0;i<NUM;i++) { cout<<a[i]<<"\t"; } cout<<endl;}//按要求的格式排列intb[9][9];voidFormat();voidFormat(){ intAR=9; intl=0; intj=0; intk=0; intx=4; intma=8; intmi=0; for(inti=1;i<18;i++) { if(i%2==0) { AR-=1; intc=0; switch(x%4) { case0: for(;c<AR;c++) { b[j][k]=a[l]; l++; if(k<ma) { k++; } } x+=1; j++; break; case1: for(;c<AR;c++) { b[j][k]=a[l]; l++; if(j<ma) { j++; } } k--; x+=1; break; case2: for(;c<AR;c++) { b[j][k]=a[l]; l++; if(k>mi) { k--; } } j--; x+=1; mi++; break; case3: for(;c<AR;c++) { b[j][k]=a[l]; l++; if(j>mi) { j--; } } x+=1; k++; ma--; break; } }else{ intc=0; switch(x%4){case0: for(;c<AR;c++) { b[j][k]=a[l]; l++; if(k<ma) { k++; } } x+=1; j++; break;case1: for(;c<AR;c++) { b[j][k]=a[l]; l++; if(j<ma) { j++; } } k--; x+=1; break;case2: for(;c<AR;c++) { b[j][k]=a[l]; l++; if(k>mi) { k--; } } j--; x+=1; mi++; break;case3: for(;c<AR;c++) { b[j][k]=a[l]; l++; if(j>mi) { j--; } } x+=1; k++; ma--; break; }}}} //输出排列以后的数组voidFormatShow();voidFormatShow(){ cout<<"\40"; for(intz=0;z<9;z++) { for(intd=0;d<9;d++) { if(b[z][d]<10) { cout<<b[z][d]<<"\40\40"; } else { cout<<b[z][d]<<"\40"; } } cout<<endl; }}//自动初始化做测试用voidinita();voidinita(){ for(inty=0;y<NUM;y++) { a[y]=y+1; }}intmain(){//GetArray();inita();Show();SortArray();Format();FormatShow();system("pause");return0;}15、490011737<490011737@qq>的螺旋矩阵#include"stdafx.h"#include<iostream>#include<vector>usingnamespacestd;intmain(){ boolok=false; intk=0; while(!ok) { cout<<"输入一个正整数"<<endl; cin>>k; if(k<=0) { continue; } ok=true; } printf("输出:\n"); vector<vector<int>>outline; outline.resize(k); for(inti=0;i<k;++i) { outline[i].resize(k); }//int**outline=newint[k][k]; intm_min=0; intm_max=k-1; intn_min=0; intn_max=k-1; intoren=1; for(inti=1;i<=k*k;) { switch(oren) { case1: for(intn_i=n_min;n_i<=n_max;++n_i) { outline[m_min][n_i]=i; ++i; } ++m_min; oren=2; break; case2: for(intm_i=m_min;m_i<=m_max;++m_i) { outline[m_i][n_max]=i; ++i; } --n_max; oren=3; break; case3: for(intn_i=n_max;n_i>=n_min;--n_i) { outline[m_max][n_i]=i; ++i; } --m_max; oren=4; break; case4: for(intm_i=m_max;m_i>=m_min;--m_i) { outline[m_i][n_min]=i; ++i; } ++n_min; oren=1; break; } } for(intm=0;m<k;++m) { for(intn=0;n<k;++n) { printf("%2d",outline[m][n]); } printf("\n"); } printf("\n"); system("pause"); return0;}16、夹手夹脚<401007009@qq>的螺旋矩阵//魔方.cpp:Definestheentrypointfortheconsoleapplication.//#include"stdafx.h"#include<iostream>#include<iomanip>usingnamespacestd;#defineNUM9 //矩阵的行列数#defineOUTP_SIZE_W3 //输出时的向右对齐的格式参数classPRectangle{public: PRectangle(); ~PRectangle(); voidPrint(); //打印矩阵 voidSetData(intcol,introw,intdata); intGetData(intcol,introw); voidMakeRotateRect(intcount,intcol,introw,intmark); voidOutput(intcol,introw);protected:private: intrect[NUM][NUM];};PRectangle::PRectangle(){ for(inti=0;i<NUM;i++) for(intj=0;j<NUM;j++) rect[i][j]=0; }PRectangle::~PRectangle(){}voidPRectangle::Output(intcol,introw){ cout<<rect[col][row]<<endl;}voidPRectangle::SetData(intcol,introw,intdata){ rect[col][row]=data;}intPRectangle::GetData(intcol,introw){ returnrect[col][row];}voidPRectangle::MakeRotateRect(intcount,intcol,introw,intmark){ if(count>NUM*NUM)return; while(row<NUM-mark) rect[col][row++]=count++; row--; col++; while(col<NUM-mark) rect[col++][row]=count++; row--; col--; while(row>mark) rect[col][row--]=count++; while(col>mark) rect[col--][row]=count++; MakeRotateRect(count,++col,++row,++mark);}voidPRectangle::Print(){ for(inti=0;i<NUM;i++) { for(intj=0;j<NUM;j++) cout<<setw(OUTP_SIZE_W)<<rect[i][j]<<""; cout<<endl; }}intmain(){ cout<<"小贝制作:"<<endl; PRectangleP; P.MakeRotateRect(1,0,0,0); P.Print(); system("pause"); return0;}17、崔增旺<6911905@qq>的螺旋矩阵#include"stdafx.h"#include<iostream>#include<stdio.h>usingnamespacestd;voidqm(intline,int*matrix);voidmat(intfirst,intline,int*matrix);intmat(intfirst,intline1,intline2,int*matrix);intmain(){ intline; intmatrix[400];//begin cout<<"Pleaseinputanumber(<20),input0toexit:"; cin>>line; while(line) { if(line<0||line>=20) { printf("Youinputawrongnumber!\n"); } else { qm(line,matrix); } cout<<"Pleaseinputanumber(<20),input0toexit:"; cin>>line; }//end return0;}voidqm(intline,int*matrix){ printf("\nThisisamatrixwith%dlines:\n",line); mat(1,line,matrix); if(line<4) { for(inti=1;i<=line;i++) { printf(""); for(intj=1;j<=line;j++) { printf("%d",matrix[(i-1)*line+j]); } printf("\n"); } } elseif(line>3&&line<10) { for(inti=1;i<=line;i++) { printf(""); for(intj=1;j<=line;j++) { printf("%02d",matrix[(i-1)*line+j]); } printf("\n"); } } elseif(line>=10&&line<=31) { for(inti=1;i<=line;i++) { printf(""); for(intj=1;j<=line;j++) { printf("%03d",matrix[(i-1)*line+j]); } printf("\n"); } } printf("\nThenumberofmatrixmemberis%d.\n\n",line*line);}voidmat(intfirst,intline,int*matrix){ mat(first,line,line,matrix);}intmat(intfirst,intline1,intline2,int*matrix){ if(line1==0) { return0; } if(line1==1) { inta0=(line2*line2-1)/2+1; matrix[a0]=first; return0; } intf=first-1; intl=line2*(line2-line1)/2+(line2-line1)/2; for(inti=1;i<=line1;i++) { l++; f++; matrix[l]=f; } for(inti=1;i<line1;i++) { l=l+line2; f++; matrix[l]=f; } for(inti=1;i<line1;i++) { l--; f++; matrix[l]=f; } for(inti=1;i<line1-1;i++) { l=l-line2; f++; matrix[l]=f; } mat(f+1,line1-2,line2,matrix);}#include"stdafx.h"#include<iostream>usingnamespacestd;classMatrix{public:Matrix(intm,intn);Matrix(constMatrix&rhs);~Matrix();Matrix&operator=(constMatrix&rhs);friendconstostream&operator<<(constostream&,Matrix&);private:introw;intcol;intnum;int**temp;};Matrix::Matrix(intm,intn):row(m),col(n),num(0){temp=newint*[row];for(inti=0;i<row;i++)temp[i]=newint[col];for(inti=0;num<row*col;i++){for(intj=i;j<col-i;j++)temp[i][j]=++num;for(intj=i+1;num<row*col&&j<row-i;j++)temp[j][col-i-1]=++num;for(intj=col-i-2;num<row*col&&j>i-1;j--)temp[row-i-1][j]=++num;for(intj=row-i-2;num<row*col&&j>i;j--)temp[j][i]=++num;}}18、我孤故我有优<724002941@qq>的螺旋矩阵Matrix::~Matrix(){for(inti=0;i<row;i++){delete[]temp[i];temp[i]=NULL;}delete[]temp;temp=NULL;}constostream&operator<<(constostream&output,Matrix&m){for(inti=0;i<m.row;i++){for(intj=0;j<m.col;j++){cout<<m.temp[i][j];cout.width(5);}cout<<"\n\n";}returnoutput;}intmain(){introw;intcol;cout<<"pleaseenterthenumberofrows:"<<endl;cin>>row;cout<<"pleaseenterthenumberofcolumns:"<<endl;cin>>col;cout<<"-------------------------------------------------"<<endl;cout<<endl;MatrixM(row,col);cout<<M; system("pause"); return0;}19、inboxisempty<hsh2j@qq>的螺旋矩阵#include"stdafx.h"#include<iostream>#include<iomanip>usingnamespacestd;intmain(){ intn,**p,i,j,s=1,m=1; cout<<"输入矩阵的阶数!"<<endl; cin>>n; p=(int**)newint[n]; for(i=0;i<n;i++) p[i]=newint[n]; for(i=0;i<n;i++)//对数组元素赋值! for(j=0;j<n;j++) p[i][j]=0; inty=n,x=n; i=0;j=0; while(1) { for(;j<y;j++) p[i][j]=m++; y--,j--,i++; for(;i<x;i++) p[i][j]=m++; x--,i--,j--; for(;j>=n-y-1;j--) p[i][j]=m++; x--;j++,i--; for(;i>=n-x-1;i--) p[i][j]=m++; y--;j++;i++;x++;y++;//cout<<endl;//cout<<i<<endl<<j<<endl<<x<<endl<<y<<endl<<m<<endl;检查光标括位置,用于控制I,J,X,Y还1有检查 if(m>n*n)//退出的条件 break; } for(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论