蛇形填数nyoj--33

蛇形填数

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述
在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
 
输入
直接输入方陈的维数,即n的值。(n<=100)
输出
输出结果是蛇形方陈。
样例输入
3
样例输出
7 8 1
6 9 2
5 4 3
来源
算法经典
上传者
首席执行官

 

 

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     int aa[105][105];
 6     int n,x,a,b,i,j;
 7     scanf("%d",&n);
 8         x=1;//第一个元素从 1 开始,
 9         memset(aa,0,sizeof(aa));
10         for(i=0;i<=n+1;i++)/*多添加了 (n+2)*(n+2)  边界元素全部为 1  作为边界用于判断*/
11         {
12             for(j=0;j<=n+1;j++)
13             {
14                  if(i==0||i==n+1||j==0||j==n+1)
15                     aa[i][j]=1;
16                     //printf("%d ",aa[i][j]);
17              }
18            //  printf("\n");
19         }//printf("\n");
20 
21         int flag=0;/*蛇形方向 下 左 上 右 0表示向下走 ,1表示向左,2表示向上,3表示向右*/
22 
23         a=0;b=n;
24         while(x!=n*n+1)
25         {
26            //printf("   flag1=%d x=%d \n==%d",flag,x,flag%4);
27             //printf("\na1=%d b1=%d\n",a,b);
28             if(flag%4==0)
29             //向下移动
30             {
31                 if(!aa[a+1][b])/*判断是否到了下边界a+1*/ aa[++a][b]=x++;
32                 else flag++;
33             }
34             if(flag%4==1)
35             //向左移动
36             {
37                 if(!aa[a][b-1])/*判断是否到了左边界b-1*/ aa[a][--b]=x++;
38                 else flag++;
39             }
40             if(flag%4==2)
41             //向上移动
42             {
43                 if(!aa[a-1][b])/*判断是否到了上边界a-1*/ aa[--a][b]=x++;
44                 else flag++;
45             }
46             if(flag%4==3)
47             //向右移动
48             {
49                 if(!aa[a][b+1])/*判断是否到了右边界b+1*/ aa[a][++b]=x++;
50                 else flag++;
51             }
52             // printf("flag2=%d x=%d \n",flag,x);
53            // if(x==n*n+1) break;
54          // printf("a2=%d b2=%d\n\n",a,b);
55 
56            /* for(i=0;i<=n+1;i++)
57             {
58                 for(j=0;j<=n+1;j++)
59                     printf("%d ",aa[i][j]);//输出格式
60                 printf("\n");
61             }printf("\n");  */
62         }
63 
64         //printf("flag=%d x=%d \n",flag,x);
65 
66         for(i=1;i<=n;i++)
67         {
68             //printf("*****\n");从i=1,j=1开始输出
69             for(j=1;j<=n;j++)
70                 printf("%d ",aa[i][j]);//输出格式
71             printf("\n");
72         }
73         return 0;
74 }
View Code

 

 
posted on 2013-07-10 10:42  yun_  阅读(216)  评论(0编辑  收藏  举报