《算法竞赛入门经典》第三章 3.1

程序 3-1

 1 #include<stdio.h>
 2 #define MAXN 100 + 10
 3 int a[MAXN];
 4 int main()
 5 {
 6     int i, x, n = 0;
 7     while(scanf("%d", &x) == 1)
 8         a[n++] = x;
 9     for(i = n-1; i>=1; i--)
10     {
11         printf("%d ", a[i]);
12     }
13     printf("%d\n", a[0]);
14     return 0;
15 }

  上面的输出方法在考研复试,王道机试遇到多次。。

  不过这次打字出错 结果总是运行时错误。

提示3-2

  如果放在main内部,将100换成100000(5个0)还是可以的,1000000(6个0)则真的异常退出。放在main之上,没有这个问题。

程序3-2

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAXN 1000 + 10
 4 int a[MAXN];
 5 int main()
 6 {
 7     int i, j, n, k, first = 1;
 8     memset(a, 0, sizeof(a));
 9     scanf("%d%d", &n, &k);
10     for(i = 1; i <=k; i++)
11         for(j = 1; j <=n; j++)
12             if(j % i ==0)
13                 a[j] = !a[j];
14     for(i = 1; i <=n; i++)
15         if(a[i])
16         {
17             if(first)
18                 first = 0;
19             else
20                 printf(" ");
21             printf("%d", i);
22         }
23     return 0;
24 }

  这个输出技巧和程序3-1的输出技巧区别在于,3-1的程序要求知道倒数第二个元素的index,而后者3-2则更一般,后者可适用更多情况。

程序3-3

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAXN 10
 4 int a[MAXN][MAXN];
 5 int main()
 6 {
 7     int n, x, y, tot = 0;
 8     scanf("%d", &n);
 9     memset(a, 0, sizeof(a));
10     tot = a[x=0][y=n-1] = 1;
11     while(tot < n*n)
12     {
13         while(x+1<n && !a[x+1][y]) a[++x][y] = ++tot;
14         while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++tot;
15         while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++tot;
16         while(y+1<n && !a[x][y+1]) a[x][++y] =  ++tot;
17 
18     }
19     for(x = 0; x < n; x++)
20     {
21         for(y = 0; y < n; y++)
22             printf("%3d", a[x][y]);
23             printf("\n");
24     }
25     return 0;
26 }

 

posted on 2014-12-29 13:46  lz亢龙有悔  阅读(125)  评论(0编辑  收藏  举报

导航