蛇形填充

蛇形填充

 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("请输入一个整型数字:
");
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("
");
37     }
38     system("pause");
39     return 0;
40 }
原文地址:https://www.cnblogs.com/liugl7/p/4821915.html