可達(dá)矩陣快速算法_第1頁
可達(dá)矩陣快速算法_第2頁
可達(dá)矩陣快速算法_第3頁
可達(dá)矩陣快速算法_第4頁
可達(dá)矩陣快速算法_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

可達(dá)矩陣快速算法(完整版)實(shí)用資料(可以直接使用,可編輯完整版實(shí)用資料,歡迎下載)

傳遞閉包Warshall方法計算可達(dá)矩陣簡要介紹①在集合X上的二元關(guān)系R的傳遞閉包是包含R的X上的最小的傳遞關(guān)系。R的傳遞閉包在數(shù)字圖像處理的圖像和視覺基礎(chǔ)、圖的連通性描述等方面都是基本概念。一般用B表示定義在具有n個元素的集合X上關(guān)系R的n×n二值矩陣,則傳遞閉包的矩陣B+可如下計算:B+=可達(dá)矩陣快速算法(完整版)實(shí)用資料(可以直接使用,可編輯完整版實(shí)用資料,歡迎下載)B+B2+B3+……+(B)n②式中矩陣運(yùn)算時所有乘法都用邏輯與代替,所有加法都用邏輯或代替。上式中的操作次序?yàn)锽,B(B),B(BB),B(BBB),……,所以在運(yùn)算的每一步我們只需簡單地把現(xiàn)有結(jié)果乘以B,完成矩陣的n次乘法即可。://93337/ism/cal_warshall_get_r_mat_detail.phpWarshall在1962年提出了一個求關(guān)系的傳遞閉包的有效算法。其具體過程如下,設(shè)在n個元素的有限集上關(guān)系R的關(guān)系矩陣為M:(1)置新矩陣A=M;(2)置k=1;(3)對所有i如果A[i,k]=1,則對j=1..n執(zhí)行:A[i,j]←A[i,j]∨A[k,j];(4)k增1;(5)如果k≤n,則轉(zhuǎn)到步驟(3),否則停止。所得的矩陣A即為關(guān)系R的傳遞閉包t(R)的關(guān)系矩陣。在《離散數(shù)學(xué)》中都提及了該算法。Warshall算法映射到有向圖中設(shè)關(guān)系R的關(guān)系圖為G,設(shè)圖G的所有頂點(diǎn)為u1,u2,…,un,則t(R)的關(guān)系圖可用該方法得到:若G中任意兩頂點(diǎn)ui和uj之間有一條路徑且沒有ui到uj的弧,則在圖G中增加一條從ui到uj的弧,將這樣改造后的圖記為G’,則G’即為t(R)的關(guān)系圖。G’的鄰接矩陣A應(yīng)滿足:若圖G中存在從ui到uj路徑,即ui與uj連通,則A[i,j]=1,否則A[i,j]=0。這樣,求t(R)的問題就變?yōu)榍髨DG中每一對頂點(diǎn)間是否連通的問題。相乘矩陣,就為所有節(jié)點(diǎn)的關(guān)系圖,也就是當(dāng)前條件下的關(guān)系矩陣。對于相乘矩陣,進(jìn)行疊代,疊代的過程為,行取值,然后計算值中對應(yīng)的每一行的值取并集,得到當(dāng)前行的關(guān)系集合。取完所有行,得到了一個新的轉(zhuǎn)移矩陣再對轉(zhuǎn)移矩陣進(jìn)行進(jìn)行求解。Warshall的疊代次數(shù)比逐次平方法的運(yùn)行效率要高。如果圖中的頂點(diǎn)是有序的排列,只要進(jìn)行一次Warshall運(yùn)算就可以獲得可達(dá)矩陣。您輸入原始矩陣matrix_A為一個方陣結(jié)果如下第1次迭代當(dāng)前0號要素a的可達(dá)集合(b,f,a)1號要素b的可達(dá)集合c,e,b5號要素f的可達(dá)集合c,f0號要素a的可達(dá)集合b,f,a當(dāng)前0號要素a的可達(dá)集合(b,f,a,c,e)當(dāng)前1號要素b的可達(dá)集合(c,e,b)2號要素c的可達(dá)集合b,c4號要素e的可達(dá)集合f,e1號要素b的可達(dá)集合c,e,b當(dāng)前1號要素b的可達(dá)集合(c,e,b,f)當(dāng)前2號要素c的可達(dá)集合(b,c)1號要素b的可達(dá)集合c,e,b,f2號要素c的可達(dá)集合b,c當(dāng)前2號要素c的可達(dá)集合(b,c,e,f)當(dāng)前3號要素d的可達(dá)集合(a,d)0號要素a的可達(dá)集合b,f,a,c,e3號要素d的可達(dá)集合a,d當(dāng)前3號要素d的可達(dá)集合(a,d,b,f,c,e)當(dāng)前4號要素e的可達(dá)集合(f,e)5號要素f的可達(dá)集合c,f4號要素e的可達(dá)集合f,e當(dāng)前4號要素e的可達(dá)集合(f,e,c)當(dāng)前5號要素f的可達(dá)集合(c,f)2號要素c的可達(dá)集合b,c,e,f5號要素f的可達(dá)集合c,f當(dāng)前5號要素f的可達(dá)集合(c,f,b,e)當(dāng)前6號要素g的可達(dá)集合(b,g)1號要素b的可達(dá)集合c,e,b,f6號要素g的可達(dá)集合b,g當(dāng)前6號要素g的可達(dá)集合(b,g,c,e,f)第1次迭代得到的轉(zhuǎn)移矩陣如下:第2次迭代當(dāng)前0號要素a的可達(dá)集合(b,f,a,c,e)1號要素b的可達(dá)集合c,e,b,f5號要素f的可達(dá)集合c,f,b,e0號要素a的可達(dá)集合b,f,a,c,e2號要素c的可達(dá)集合b,c,e,f4號要素e的可達(dá)集合f,e,c當(dāng)前0號要素a的可達(dá)集合(b,f,a,c,e)當(dāng)前1號要素b的可達(dá)集合(c,e,b,f)2號要素c的可達(dá)集合b,c,e,f4號要素e的可達(dá)集合f,e,c1號要素b的可達(dá)集合c,e,b,f5號要素f的可達(dá)集合c,f,b,e當(dāng)前1號要素b的可達(dá)集合(c,e,b,f)當(dāng)前2號要素c的可達(dá)集合(b,c,e,f)1號要素b的可達(dá)集合c,e,b,f2號要素c的可達(dá)集合b,c,e,f4號要素e的可達(dá)集合f,e,c5號要素f的可達(dá)集合c,f,b,e當(dāng)前2號要素c的可達(dá)集合(b,c,e,f)當(dāng)前3號要素d的可達(dá)集合(a,d,b,f,c,e)0號要素a的可達(dá)集合b,f,a,c,e3號要素d的可達(dá)集合a,d,b,f,c,e1號要素b的可達(dá)集合c,e,b,f5號要素f的可達(dá)集合c,f,b,e2號要素c的可達(dá)集合b,c,e,f4號要素e的可達(dá)集合f,e,c當(dāng)前3號要素d的可達(dá)集合(a,d,b,f,c,e)當(dāng)前4號要素e的可達(dá)集合(f,e,c)5號要素f的可達(dá)集合c,f,b,e4號要素e的可達(dá)集合f,e,c2號要素c的可達(dá)集合b,c,e,f當(dāng)前4號要素e的可達(dá)集合(f,e,c,b)當(dāng)前5號要素f的可達(dá)集合(c,f,b,e)2號要素c的可達(dá)集合b,c,e,f5號要素f的可達(dá)集合c,f,b,e1號要素b的可達(dá)集合c,e,b,f4號要素e的可達(dá)集合f,e,c,b當(dāng)前5號要素f的可達(dá)集合(c,f,b,e)當(dāng)前6號要素g的可達(dá)集合(b,g,c,e,f)1號要素b的可達(dá)集合c,e,b,f6號要素g的可達(dá)集合b,g,c,e,f2號要素c的可達(dá)集合b,c,e,f4號要素e的可達(dá)集合f,e,c,b5號要素f的可達(dá)集合c,f,b,e當(dāng)前6號要素g的可達(dá)集合(b,g,c,e,f)第2次迭代得到的轉(zhuǎn)移矩陣如下:第3次迭代當(dāng)前0號要素a的可達(dá)集合(b,f,a,c,e)1號要素b的可達(dá)集合c,e,b,f5號要素f的可達(dá)集合c,f,b,e0號要素a的可達(dá)集合b,f,a,c,e2號要素c的可達(dá)集合b,c,e,f4號要素e的可達(dá)集合f,e,c,b當(dāng)前0號要素a的可達(dá)集合(b,f,a,c,e)當(dāng)前1號要素b的可達(dá)集合(c,e,b,f)2號要素c的可達(dá)集合b,c,e,f4號要素e的可達(dá)集合f,e,c,b1號要素b的可達(dá)集合c,e,b,f5號要素f的可達(dá)集合c,f,b,e當(dāng)前1號要素b的可達(dá)集合(c,e,b,f)當(dāng)前2號要素c的可達(dá)集合(b,c,e,f)1號要素b的可達(dá)集合c,e,b,f2號要素c的可達(dá)集合b,c,e,f4號要素e的可達(dá)集合f,e,c,b5號要素f的可達(dá)集合c,f,b,e當(dāng)前2號要素c的可達(dá)集合(b,c,e,f)當(dāng)前3號要素d的可達(dá)集合(a,d,b,f,c,e)0號要素a的可達(dá)集合b,f,a,c,e3號要素d的可達(dá)集合a,d,b,f,c,e1號要素b的可達(dá)集合c,e,b,f5號要素f的可達(dá)集合c,f,b,e2號要素c的可達(dá)集合b,c,e,f4號要素e的可達(dá)集合f,e,c,b當(dāng)前3號要素d的可達(dá)集合(a,d,b,f,c,e)當(dāng)前4號要素e的可達(dá)集合(f,e,c,b)5號要素f的可達(dá)集合c,f,b,e4號要素e的可達(dá)集合f,e,c,b2號要素c的可達(dá)集合b,c,e,f1號要素b的可達(dá)集合c,e,b,f當(dāng)前4號要素e的可達(dá)集合(f,e,c,b)當(dāng)前5號要素f的可達(dá)集合(c,f,b,e)2號要素c的可達(dá)集合b,c,e,f5號要素f的可達(dá)集合c,f,b,e1號要素b的可達(dá)集合c,e,b,f4號要素e的可達(dá)集合f,e,c,b當(dāng)前5號要素f的可達(dá)集合(c,f,b,e)當(dāng)前6號要素g的可達(dá)集合(b,g,c,e,f)1號要素b的可達(dá)集合c,e,b,f6號要素g的可達(dá)集合b,g,c,e,f2號要素c的可達(dá)集合b,c,e,f4號要素e的可達(dá)集合f,e,c,b5號要素f的可達(dá)集合c,f,b,e當(dāng)前6號要素g的可達(dá)集合(b,g,c,e,f)第3次迭代得到的轉(zhuǎn)移矩陣如下:VisualC++技術(shù)交流匯《螺旋矩陣》群號: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的數(shù):"); 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、網(wǎng)上普遍的螺旋矩陣#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;//記錄是否已被填數(shù)用于確定轉(zhuǎn)彎方向 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)//調(diào)用函數(shù)的次數(shù)(n*n-2)次因?yàn)樯厦嬉呀?jīng)調(diào)用一次 { 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)//用于轉(zhuǎn)向當(dāng)碰到0或者前面已被數(shù)據(jù)填充時轉(zhuǎn)向 { 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;//從外往里數(shù)層次 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;//定義行列循環(huán)變量 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];//二維數(shù)組 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)//當(dāng)n為奇數(shù)時,中心數(shù)字為最后的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)//判斷該方向的前驅(qū)位置是否已放置元素 { i--;Direction=UP; } else//否則轉(zhuǎn)向,下同 { if(!Data[i][j+1].IsPlace) { j++; Direction=RIGHT; } else//已排序結(jié)束;跳出 break; } } else//原地不動,只轉(zhuǎn)方向,值減1,轉(zhuǎn)向后重新在該位置賦值 { num--; Direction=RIGHT; } break; caseDOWN: if(i+1<=8) { if(!Data[i+1][j].IsPlace)//判斷該方向的前驅(qū)位置是否已放置元素 { i++;Direction=DOWN; } else { if(!Data[i][j-1].IsPlace) { j--; Direction=LEFT; } else//已結(jié)束;跳出 break; } } else { num--; Direction=LEFT; } break; caseLEFT: if(j-1>=0) { if(!Data[i][j-1].IsPlace)//判斷該方向的前驅(qū)位置是否已放置元素 { j--;Direction=LEFT; } else { if(!Data[i-1][j].IsPlace) { i--; Direction=UP; } else//已結(jié)束;跳出 break; } } else { num--; Direction=UP; } break; caseRIGHT: if(j+1<=8) { if(!Data[i][j+1].IsPlace)//判斷該方向的前驅(qū)位置是否已放置元素 { 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;//數(shù)組 intx(0),y(0);//標(biāo)定數(shù)組使用 intx1(0),y1(0);//計算下一個元素位置 intdx(0);//數(shù)組移動 cout<<"請輸入數(shù)組的行數(shù):"<<endl; cin>>i; cout<<"請輸入數(shù)組的列數(shù):"<<endl; cin>>j; intarr[20][20]; memset(arr,0,sizeof(arr)); intnum;//數(shù)組賦值使用 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]; }//輸出矩陣數(shù)組 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、風(fēng)痕<506520543@qq>的螺旋矩陣#include"stdafx.h"#include<iostream>#include<string.h>usingnamespacestd;intinitNum=1;//direction1向右,2向下,3向左,4向上//x橫向位置,y縱向位置//nSub代表是縮進(jìn)去幾行幾列//bool判斷是否還繼續(xù)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<<"輸入縮進(jìn)數(shù):"; cin>>nSub; if(nSub>n/2) { cout<<"縮進(jìn)太多!!"<<endl; continue; } if(n<=0||nSub<0) { cout<<"誰讓你輸那么小的數(shù)了,不做!!"<<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;//變形數(shù)組 intn;//二維矩陣的階 cout<<"請輸入二維矩陣的階(小于等于100):"; cin>>n; intfx=0;//方向 inti=0,j=0;//數(shù)組下標(biāo): intsum=1;//矩陣中最大的數(shù) 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表示總循環(huán)的次數(shù)也就是數(shù)組有多少圈 inta[100][100]={0};// printf("請輸入數(shù)組的維數(shù):"); cout<<"請輸入數(shù)組的維數(shù):";// scanf("%i",&n); cin>>n; a[(n+1)/2][(n+1)/2]=n*n; //對數(shù)組的中心數(shù)字值賦值,若數(shù)組的維數(shù)為偶數(shù),則所賦的值無效(被后面的賦值覆蓋) for(x=1;x<=(n+1)/2;x++) //從外向內(nèi),一圈一圈的對數(shù)組進(jìn)行賦值 { 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++; } }//輸出數(shù)組中的數(shù)字 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>//螺旋矩陣順序輸入增值正數(shù)(可定制任意長寬)usingnamespacestd;voidmain(){intnum,x,y,a=0,b=0,h,cishu=0,o=1,luoxuan[15][15]={0};cout<<"使用實(shí)數(shù)輸入矩陣的寬和高"<<endl;cin>>x>>y;cout<<"==========================================="<<endl;if(x>15||y>15||0>x||0>y)cout<<"螺旋矩陣寬高限制正數(shù)以內(nèi)"<<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、無心再戰(zhàn)<110490858@qq>的螺旋矩陣/矩陣排序/#include"stdafx.h"#include<iostream>usingnamespacestd;constintNUM=81;constintMAX=80;inta[NUM];//獲取數(shù)組元素輸入voidGetArray();voidGetArray(){ cout<<"請輸入數(shù)組元素"<<endl; for(inti=0;i<NUM;i++) { cout<<"這是第"<<i+1<<"個元素"<<endl; cin>>a[i]; }}//將數(shù)組按小到大排好順序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; }}}} //輸出排列以后的數(shù)組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<<"輸入一個正整數(shù)"<<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 //矩陣的行列數(shù)#defineOUTP_SIZE_W3 //輸出時的向右對齊的格式參數(shù)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、我孤故我有優(yōu)<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<<"輸入矩陣的階數(shù)!"<<endl; cin>>n; p=(int**)newint[n]; for(i=0;i<n;i++) p[i]=newint[n]; for(i=0;i<n;i++)//對數(shù)組元素賦值! 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;檢查光標(biāo)括位置,用于控制I,J,X,Y還1有檢查 if(m>n*n)//退出的條件 break; } for(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論