HDOJ-2153

仙人球的残影

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6851    Accepted Submission(s): 3192


Problem Description
在美丽的HDU,有一名大三的同学,他的速度是众所周知的,跑100米仅仅用了2秒47,在他跑步过程中会留下残影的哎,大家很想知道他是谁了吧,他叫仙人球,既然名字这样了,于是他的思想是单一的,他总是喜欢从一点出发,经过3次转折(每次向右转90°),回到出发点,而且呢,他每次转折前总是跑相同长度的路程,所以很多人都想知道如果用‘1’算他跑步出发的第一个残影的话,那么回到起点的时候,他的残影是怎么样的呢?

 

Input
测试数据有多行,每一行为一个数N(1<=N<=10)(以0结尾,0不做处理),即仙人球在没有回到起点的时候,跑过留下N个残影后突然90°右转。

 

Output
每组测试数据输出一个结果,并且每个残影的计数位长度为3个字符长度。(当然N等于1的话,它的结果也是占用3个字符位置的)

 

Sample Input
4

 

Sample Output
1  2  3  4
12  5  11  6
10  9  8  7

 

找了半天规律,最后写出700B的代码,后来在讨论区看见了几个有趣的解法,贴出来的大家分享一下,侵转删。。

1.首先是我的AC代码

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n;
 8     while(scanf("%d",&n)&&n)
 9     {
10         if(n==1)//仅一个的情况 
11         {
12             printf("  1\n");
13             continue;
14         }
15         for(int i=1; i<=n; i++)//第一行 
16             printf("%3d",i);//输出占三个字符 
17         printf("\n");
18         for(int i=2; i<=n-1; i++)//除最后一行剩余行数 
19             for(int j=1; j<=n; j++)
20             {
21                 if(j!=1&&j!=n)//除首尾外输出空格 
22                     printf("   ");
23                 else if(j==1)
24                     printf("%3d",n*n-(n-2)*(n-2)-i+2);
25                 else if(j==n)
26                     printf("%3d\n",n+i-1);
27             }
28         for(int i=1; i<=n; i++)//最后一行 
29             printf("%3d",n*n-(n-2)*(n-2)-(n-2)-i+1);
30         printf("\n");
31     }
32     return 0;
33 }

 

2.这是一个给边缘赋值,中间为空由此输出三个空字符的算法,确实有一套。

 1 #include <stdio.h>
 2 #include <string.h>
 3 int x,y,n,m;
 4 int a[100][100];
 5 int main()
 6 {
 7     int i,j;
 8     while(scanf("%d",&n)!=EOF&&n)
 9     {
10             memset(a,0,sizeof(a));
11         int x=0,y=0,s=0;
12         while(1)//边缘赋值 
13         {
14             while(y<n-1) a[x][++y]=++s;
15             while(x<n-1) a[++x][y]=++s;
16             while(y-1>=0)a[x][--y]=++s;
17             while(!a[x-1][0])a[--x][y]=++s;
18             break;
19         }
20         for(i=0;i<n;i++)//中间为空 
21         {
22             for(j=0;j<n;j++)
23             {
24                 if(a[i][j]==0)
25                     printf("   ");
26                 else
27                     printf("%3d",a[i][j]);
28             }
29             printf("\n");
30         }
31     }
32     return 0;
33 }

 

3.哈哈哈哈第三种看到时Kiven当场噗出生来,从某种意义上来说比我们这些找规律的机智多了。 我服!

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <math.h>
 5 using namespace std;
 6 int main()
 7 { int n;
 8   while(scanf("%d",&n)!=EOF && n)
 9     {
10       if (n==1) printf("  1\n");
11       if (n==2) printf("  1  2\n  4  3\n");
12       if (n==3) printf("  1  2  3\n  8     4\n  7  6  5\n");
13       if (n==4) printf("  1  2  3  4\n 12        5\n 11        6\n 10  9  8  7\n");
14       if (n==5) printf("  1  2  3  4  5\n 16           6\n 15           7\n 14           8\n 13 12 11 10  9\n");
15       if (n==6) printf("  1  2  3  4  5  6\n 20              7\n 19              8\n 18              9\n 17             10\n 16 15 14 13 12 11\n");
16       if (n==7) printf("  1  2  3  4  5  6  7\n 24                 8\n 23                 9\n 22                10\n 21                11\n 20                12\n 19 18 17 16 15 14 13\n");
17       if (n==8) printf("  1  2  3  4  5  6  7  8\n 28                    9\n 27                   10\n 26                   11\n 25                   12\n 24                   13\n 23                   14\n 22 21 20 19 18 17 16 15\n");
18       if (n==9) printf("  1  2  3  4  5  6  7  8  9\n 32                      10\n 31                      11\n 30                      12\n 29                      13\n 28                      14\n 27                      15\n 26                      16\n 25 24 23 22 21 20 19 18 17\n");
19       if (n==10) printf("  1  2  3  4  5  6  7  8  9 10\n 36                         11\n 35                         12\n 34                         13\n 33                         14\n 32                         15\n 31                         16\n 30                         17\n 29                         18\n 28 27 26 25 24 23 22 21 20 19\n");
20     }
21 }

 

posted @ 2016-05-04 23:57  Kiven#5197  阅读(165)  评论(0编辑  收藏  举报