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
");
13             continue;
14         }
15         for(int i=1; i<=n; i++)//第一行 
16             printf("%3d",i);//输出占三个字符 
17         printf("
");
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+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("
");
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("
");
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
");
11       if (n==2) printf("  1  2
  4  3
");
12       if (n==3) printf("  1  2  3
  8     4
  7  6  5
");
13       if (n==4) printf("  1  2  3  4
 12        5
 11        6
 10  9  8  7
");
14       if (n==5) printf("  1  2  3  4  5
 16           6
 15           7
 14           8
 13 12 11 10  9
");
15       if (n==6) printf("  1  2  3  4  5  6
 20              7
 19              8
 18              9
 17             10
 16 15 14 13 12 11
");
16       if (n==7) printf("  1  2  3  4  5  6  7
 24                 8
 23                 9
 22                10
 21                11
 20                12
 19 18 17 16 15 14 13
");
17       if (n==8) printf("  1  2  3  4  5  6  7  8
 28                    9
 27                   10
 26                   11
 25                   12
 24                   13
 23                   14
 22 21 20 19 18 17 16 15
");
18       if (n==9) printf("  1  2  3  4  5  6  7  8  9
 32                      10
 31                      11
 30                      12
 29                      13
 28                      14
 27                      15
 26                      16
 25 24 23 22 21 20 19 18 17
");
19       if (n==10) printf("  1  2  3  4  5  6  7  8  9 10
 36                         11
 35                         12
 34                         13
 33                         14
 32                         15
 31                         16
 30                         17
 29                         18
 28 27 26 25 24 23 22 21 20 19
");
20     }
21 }
原文地址:https://www.cnblogs.com/Kiven5197/p/5460301.html