蛇形填数

今天在笔试遇到的题。

在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 }

 

posted @ 2015-09-24 01:31  ChessChan  阅读(363)  评论(0编辑  收藏  举报