http://acm.hdu.edu.cn/showproblem.php?pid=4671
这个高端的题意啊 看了N久啊
n>m时 直接第一列按顺序来 第二列为M+1
else 第一列顺序来 第二列 按第一组为N 第二组为N-1 依次分配
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 using namespace std; 7 #define N 110 8 int f[110][110],a[110][110],x[110]; 9 int main() 10 { 11 int i,j,k,n,m; 12 while(cin>>n>>m) 13 { 14 memset(f,0,sizeof(f)); 15 if(n>m) 16 { 17 for(i = 1; i <= m ; i++) 18 { 19 a[i][1] = i; 20 f[i][i] = 1; 21 } 22 for(i = 1 ; i <= m ; i++) 23 { 24 a[i][2] = m+1; 25 f[i][m+1] = 1; 26 } 27 for(i = 1; i <= m ; i++) 28 { 29 printf("%d %d",a[i][1],a[i][2]); 30 for(j = 1; j <= n ; j++) 31 { 32 if(!f[i][j]) 33 printf(" %d",j); 34 } 35 puts(""); 36 } 37 } 38 else 39 { 40 int j = 1; 41 for(i = 1; i <= m ; i++) 42 { 43 f[i][j] = 1; 44 a[i][1] = j++; 45 if(j>n) 46 j = 1; 47 } 48 for(i = 1; i <= n ; i++) 49 x[i] = n; 50 j = 1; 51 for(i = 1; i <= m ; i++) 52 { 53 int o = a[i][1]; 54 if(o == x[j]) 55 x[j]--; 56 if(x[j]<1) x[j] = n; 57 f[i][x[j]] = 1; 58 a[i][2] = x[j]--; 59 if(x[j]<1) 60 x[j] = n; 61 j++; 62 if(j>n) j = 1; 63 } 64 for(i = 1; i <= m ; i++) 65 { 66 printf("%d %d",a[i][1],a[i][2]); 67 for(j = 1; j <= n ; j++) 68 { 69 if(!f[i][j]) 70 printf(" %d",j); 71 } 72 puts(""); 73 } 74 } 75 } 76 return 0; 77 }