1. Z字扫描
代码:
//Z字扫描 #include<iostream> #include<vector> using namespace std; int main() { int cd = -1; //步长后面的1 int d = 0; //步长 int a[10][10] = {0}; int i=0,j=0; int k = 0; //需要付的值 if(d%2==0 && cd==-1) //初始化 { a[i][j]=k; ++k; ++j; ++d; cd=1; } //该算法 n*n维需要2*n-2次循环(即2*n-2条折线) const int n = 10; for(int sz=0;sz<18;++sz) { if(d%2==1 && cd ==1) //偶数步长后面的1 下一步转到奇数步长 { a[i][j]=k; ++k; cd=0; } else if(d%2==1 && cd ==0) //奇数步长 下一步转到奇数步长后的1 { int dd = d; int tp = 1; while(dd>=1) { a[tp][d-tp] = k; --dd; ++k; ++tp; } cd=1; i = i+d+1; j = d-j; ++d; } else if(d%2==0 && cd==1) //奇数步长后面的1 下一步转到偶数步长 { a[i][j]=k; ++k; cd=0; } else if(d%2==0 && cd ==0) //偶数步长 下一步转到偶数步长后的1 { int dd = d; int tp = d-1; while(dd>=1) { a[tp][d-tp] = k; --dd; ++k; --tp; } cd=1; j = j+d+1; i = d-i; ++d; } } //另一半与前一半的关系:a[n-1-t1][n-1-t2] = n*n-1-a[t1][t2]; for(int t1=0;t1<9;++t1) { int len = 9; for(int t2=0;t2<len;++t2) a[n-1-t1][n-1-t2] = n*n-1-a[t1][t2]; --len; } //打印 int enter = 0; for(int ti=0;ti<10;++ti) for(int tj=0;tj<10;++tj) { cout<<a[ti][tj]<<"/t"; ++enter; if(enter == 0) cout<<endl; } return 0; }
结果:
2.回环圈
代码:
//打印回环圈 #include<iostream> using namespace std; int main() { int d=1;//步长 int n=0;//维数 cout<<"请输入维数的大小:"; cin>>n; //动态分配一个二维数组 int **a = new int*[n]; for(int i=0;i<n;++i) a[i] = new int[n]; int k = 0;//赋给数组的值 int cd = 1;//标志步长的方向,1向东,-1向西,2向北,-2向南 int i=0,j=0; //根据维数确定第一个元素的位置 if(n%2 == 1) i=(n-1)/2, j=(n-1)/2; else i=n/2-1,j=n/2-1; a[i][j] = k; //初始化 ++j; ++k; for(int sz=0;sz<2*n-1;++sz) //if(n%2 ==1) { if(cd == 1) //向东 { int dd = d; while(dd>=1) { a[i][j] = k; ++k; if(--dd > 0) ++j; } ++i; cd = -2; } else if(cd == -2) //向南 { int dd = d; while(dd>=1) { a[i][j] = k; ++k; if(--dd > 0) ++i; } --j; cd = -1; ++d; } else if(cd == -1) //向西 { int dd = d; while(dd>=1) { a[i][j] = k; ++k; if(--dd > 0) --j; } --i; cd = 2; } else if(cd == 2) //向北 { int dd = d; while(dd>=1) { a[i][j] = k; ++k; if(--dd > 0) --i; } ++j; cd = 1; ++d; } } //打印 int enter =0; for(int i=0;i<n;++i) for(int j=0;j<n;++j) { cout<<a[i][j]<<"/t"; ++enter; if(enter%n == 0) cout<<endl; } return 0; }
结果: