蛇形填充
1 //局限性:由于编译框显示限制,只能实现1-20的功能 2 #include <iostream> 3 #include <string.h> 4 using namespace std; 5 #define MAXN 20 6 int a[MAXN][MAXN]; 7 8 int main(){ 9 int n,x,y,tot=0; 10 cout<<"请输入一个不大于20的正整数"<<endl; 11 cin>>n; 12 memset(a,0,sizeof(a));//将已开辟内存空间a的首sizeof(a)个字节的值设为值0。 13 //函数原型为:void *memset(void *s,int c,size_t n) 14 tot=a[x=0][y=n-1]=1; 15 16 while(tot<n*n){ 17 while(x+1<n&&!a[x+1][y]) a[++x][y]=++tot; 18 //精彩之处在于while循环的设置,还有判断是否为0的操作至关重要, 19 //这里的设置完全遵循了 “蛇形填充”的过程 20 while(y-1>=0&&!a[x][y-1]) a[x][--y]=++tot; 21 while(x-1>=0&&!a[x-1][y]) a[--x][y]=++tot; 22 while(y+1<n&&!a[x][y+1]) a[x][++y]=++tot; 23 } 24 25 for(x=0;x<n;++x){ 26 for(y=0;y<n;++y){ 27 printf("%4d",a[x][y]);// a[x][y]; 28 } 29 cout<<endl; 30 } 31 32 } 33
另一个方法(其实大同小异):
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(){ 5 int i=0; 6 int j=0; 7 int k=0; 8 int data[20][20]={0}; 9 int count=0; 10 int N=0; 11 printf("请输入一个整型数字:\n"); 12 scanf("%d",&N); 13 14 for(k=0;k<N/2;k++){ //共有N/2圈循环,由外及里赋值 15 for(i=k;i<N-k;i++){ //未赋值的最上层 16 data[k][i]=++count; 17 } 18 for(i=k+1;i<N-k;i++){ //未赋值的最右侧 +1是因为上面的for循环已经赋值了一层 19 data[i][N-k-1]=++count; 20 } 21 for(i=N-k-2;i>k;i--){ //未赋值的最下层 一共N-1层,N-1-k,k是变量,代表第几圈 22 data[N-k-1][i]=++count; 23 } 24 for(i=N-k-1;i>k;i--){ 25 data[i][k]=++count;//未赋值的最左侧 26 } 27 } 28 29 if(N%2!=0){ //解决上面 k<N/2 遗漏的部分 30 data[N/2][N/2]=N*N; 31 } 32 for(i=0;i<N;i++){ 33 for(j=0;j<N;j++){ 34 printf("%3d",data[i][j]); 35 } 36 printf("\n"); 37 } 38 system("pause"); 39 return 0; 40 }