蛇形填数
今天在笔试遇到的题。
在n*n的矩阵里填入1,2,...,n*n,要求填成蛇形。例如n=4时矩阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
一般思路
1)0初始化一个二位数组
2)从右上角开始往下走,直到某节点的下面节点不是 0 或者越界(判断条件),就往左走,然后往上走,往右走
3)重复操作,直到数组没有0
1 #include <stdio.h> 2 int k=1;//用来累加到数组 3 int qn; 4 void fun(int (*a)[qn],int x,int y,int n) 5 { 6 if(a[x][y]!=0) 7 return; 8 while(a[x][y]==0) 9 { 10 a[x][y]=k++; 11 if(x+1==n||a[x+1][y]!=0) 12 { 13 y--; 14 break; 15 16 } 17 x++; 18 } 19 while(a[x][y]==0) 20 { 21 a[x][y]=k++; 22 if(y-1==-1||a[x][y-1]!=0) 23 { 24 x--; 25 break; 26 27 } 28 y--; 29 } 30 31 while(a[x][y]==0) 32 { 33 a[x][y]=k++; 34 if(x-1==-1||a[x-1][y]!=0) 35 { 36 y++; 37 break; 38 39 } 40 x--; 41 } 42 43 while(a[x][y]==0) 44 { 45 a[x][y]=k++; 46 if(y+1==n||a[x][y+1]!=0) 47 { 48 x++; 49 break; 50 51 } 52 y++; 53 } 54 55 fun(a,x,y,--n); 56 return ; 57 58 59 } 60 61 int main() 62 { 63 int n; 64 scanf("%d",&n); 65 qn=n; 66 int a[n][n]; 67 for(int i=0;i<n;i++) 68 for(int j=0;j<n;j++) 69 a[i][j]=0; 70 fun(a,0,n-1,n); 71 for(int i=0;i<n;i++) 72 for(int j=0;j<n;j++) 73 { 74 75 printf("%d ",a[i][j]); 76 if(j==n-1) 77 printf("\n"); 78 } 79 }
换个思路:
其实这是个4-联通问题
从右上角开始,每个节点依次:向下走->向左走->向上走->向右走
1 #include <stdio.h> 2 3 int k=1;//用来累加到数组 4 int qn; 5 void fun(int (*a)[qn],int x,int y,int n) 6 { 7 if(a[x][y]==0 && x<n && y<n && x>=0 && y>=0) 8 { 9 a[x][y]=k++; 10 if(a[x][y+1]!=0||y+1==n) 11 fun(a,x+1,y,n);//向下 12 fun(a,x,y-1,n);//向左 13 fun(a,x-1,y,n);//向上 14 fun(a,x,y+1,n);//向右 15 16 17 } 18 } 19 20 int main() 21 { 22 int n; 23 scanf("%d",&n); 24 qn=n; 25 int a[n][n]; 26 for(int i=0;i<n;i++) 27 for(int j=0;j<n;j++) 28 a[i][j]=0; 29 fun(a,0,n-1,n); 30 for(int i=0;i<n;i++) 31 for(int j=0;j<n;j++) 32 { 33 34 printf("%d ",a[i][j]); 35 if(j==n-1) 36 printf("\n"); 37 } 38 }