link:http://acm.hdu.edu.cn/showproblem.php?pid=4671
其实是不难的那种构造题,先排第一列,第二列从后往前选。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include <set> 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22 #include 23 #include 24 const int INF = 0x3f3f3f3f; 25 const int dir[8][2] = {{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}}; 26 using namespace std; 27 int sad[111], fun[111][111]; 28 int main(void) 29 { 30 int n, m; 31 while (~scanf("%d%d",&n,&m)) 32 { 33 for(int i=1;i<=n;++i) 34 { 35 sad[i]=m/n; 36 if(i<=m%n) sad[i]++; 37 } 38 int row=1; 39 for(int i=1;i<=n;++i) 40 { 41 int k=n; 42 for(int j=1;j<=sad[i];++j) 43 { 44 while (i==k||k==0) 45 {if(i==k) k--; 46 if(k==0) k=n;} 47 fun[row][0]=i; 48 fun[row][1]=k; 49 k--; row++; 50 } 51 } 52 for(int i=1;i<=m;++i) 53 { 54 printf("%d %d",fun[i][0],fun[i][1]); 55 for(int j=1;j<=n;++j) 56 { 57 if(j!=fun[i][0]&&j!=fun[i][1]) printf(" %d",j); 58 } 59 printf("\n"); 60 } 61 } 62 return 0; 63 }
代码写的很清楚,不行模拟一下什么就懂了。