原文地址:https://my.oschina.net/meiguizhinian/blog/edit/873697
Description
在一个2行3列的表格中,不重复地填入数字1、2、3、4、5和6。要求左右相邻的数字右边的数字比左边的数字大,上下相邻的数字下边的数字比上边的数字大。这样的表格一共有5种,可以把这5种表格按照字典序排序(排序时可以把表格的第2行移动到第1行的右边连成一个字符串,以字符串排序)。
The Input
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据占一行,其中只包含一个整数i(1≤i≤5)。在行首和行尾没有多余的空格。
The Output
对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案。每组答案占两行,即问题描述中按照字典序排在第i位的表格。该表格的每行包含三个整数,相邻的两个整数之间以一个空格隔开。在每行的第一个数之前和最后一个数之后不要输出多余的空格。在所有数据前后不要输出多余的空行,两组数据之间也不要输出多余的空行。
Sample Input
1 3
Sample Output
1 2 3 4 5 6 1 2 5 3 4 6
解题思路
代码
#include <stdio.h>
int main() {
int list[5][6];
int k=0;
for (int a=2; a!=4; ++a) {
for (int b=a+1; b!=6; ++b) {
for (int c=2; c!=5; ++c) {
if (c==a || c==b) {
continue;
}
for (int d=c+1; d!=6; ++d) {
if (d==a || d==b) {
continue;
}
int (&ref)[6] = list[k++];
ref[0] = 1;
ref[1] = a;
ref[2] = b;
ref[3] = c;
ref[4] = d;
ref[5] = 6;
}
}
}
}
while (scanf("%d",&k)!=EOF) {
if (0<k && k<6) {//[1,6]
--k;
printf("%d %d %d\n%d %d %d\n",list[k][0],list[k][1],list[k][2],list[k][3],list[k][4],list[k][5]);
}
}
return 0;
}