题意:题目真难懂  自行理解。。。

解题思路:其实只要考虑两列就可以了,对于第一列都某个服务器,如果它坏了的话,就会有第二列的补上,所以我们只需要构造两列,第一列就按照1-n循环排,然后对于每个服务器,如果这个服务器坏了的话,从未排全的数开排,如果等于这个服务器编号,跳一个即可。。

解题代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 int a[1000][1000];
 5 int ths[1000][1000];
 6 int temp[1000];
 7 int main()
 8 {
 9    int n , m;
10    while(scanf("%d %d",&n,&m) != EOF)
11    {
12      memset(a,0,sizeof(a));
13 
14      memset(temp,0,sizeof(temp));
15      memset(ths,0,sizeof(ths));
16      int k;
17      for(int i = 1;i <= m;i ++)
18      {    k = (i-1)%n+1;
19           a[i][1] = k;
20           ths[i][a[i][1]] = 1;
21      }
22      for(int i = 1;i <= n;i ++)
23      {
24         temp[i] = (k)%n + 1 ;
25      }
26      for(int i = 1;i <= m; i ++)
27      {
28         if(temp[a[i][1]] == a[i][1])
29             temp[a[i][1]] =  temp[a[i][1]]%n +1;
30         a[i][2] = temp[a[i][1]];
31         ths[i][a[i][2]] = 1;
32         temp[a[i][1]] = temp[a[i][1]] % n + 1;
33      }
34     for(int i = 1;i <= m;i ++)
35     {
36        int be = 1;
37        for(int j = 3; j<= n;j ++)
38        {
39            while(ths[i][be] == 1)
40              be++;
41            a[i][j] = be;
42            ths[i][be] = 1;
43        }
44     }
45     for(int i = 1;i <= m;i ++)
46     {
47       for(int j = 1;j <= n;j ++)
48         printf(j == 1?"%d":" %d",a[i][j]);
49       printf("\n");
50     }
51    }
52   return 0 ;
53 }
View Code

 

posted on 2013-08-14 09:36  dark_dream  阅读(308)  评论(0编辑  收藏  举报