《算法竞赛入门经典》第三章 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 }

 

你可能感兴趣的:(算法)