首页 > 杭电1716

杭电1716

排列2

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 2076    Accepted Submission(s): 816





Problem Description
Ray又对数字的列产生了兴趣:

现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数。

 

Input
每组数据占一行,代表四张卡片上的数字(0<=数字<=9),如果四张卡片都是0,则输入结束。

 

Output
对每组卡片按从小到大的顺序输出所有能由这四张卡片组成的4位数,千位数字相同的在同一行,同一行中每个四位数间用空格分隔。

每组输出数据间空一行,最后一组数据后面没有空行。

 

Sample Input
1 2 3 4
1 1 2 3
0 1 2 3
0 0 0 0

 

Sample Output
1234 1243 1324 1342 1423 1432
2134 2143 2314 2341 2413 2431
3124 3142 3214 3241 3412 3421
4123 4132 4213 4231 4312 4321
1123 1132 1213 1231 1312 1321
2113 2131 2311 3112 3121 3211
1023 1032 1203 1230 1302 1320
2013 2031 2103 2130 2301 2310
3012 3021 3102 3120 3201 3210

 

Source
2007省赛集训队练习赛(2)

 

Recommend
lcy
Analyse:

 感觉这题和1027有点雷同,都是将一个数字的几个位调来调去。但是1027比较简单,每个输入只要求输出一个数字串,这个要的是全部数字串,但用的基本思路和1027一样(用函数的递归调用,以及对各个数字标记的方法)。首先升序排好各个数字,当然是由小到大地放好每个数字得出的数是最小的。每输出一个位的数字就标记该数字为不可用。

View Code
 1 #include

2 #include<string.h>

3 char num[30][6];//用来放生成的数字串

4 int count;//作为生成的数字的索引

5 int n[4]={ 6,2,2,1};

6 void swap(int *x,int *y)

7 {

8 int temp;

9 temp=*x;

10 *x=*y;

11 *y=temp;

12 }

13 void getnum(int a[4][2],int pos)//pos表示这是第几位的数字(万位为第1位)

14 {

15 int i,j;

16 for(i=0;i<4;i++)

17 {

18 //遇到第一位是0则跳过

19 if(pos==1 && a[i][0]==0)

20 continue;

21 if(a[i][1]==1)

22 {

23 for(j=0;j1];j++)

24 num[count+j][pos-1]=a[i][0]+'0';

25 //每次把最后一位的数字确定,count自增,指向下一个数字串

26 if(pos==4)

27 count++;

28 //若未到最后一位则继续自我调用

29 else

30 {

31 //标记为不可用

32 a[i][1]=0;

33 getnum(a,pos+1);

34 //重新标记为可用

35 a[i][1]=1;

36 }

37 }

38 }

39 }

40 //此函数将重复的(后面的)数字串去掉,方法是在该数字串的头位放空字符做标记

41 void delrepeat()

42 {

43 int i,j;

44 for(i=1;i<24;i++)

45 {

46 for(j=0;j0;j++);

47 if(j
48 num[i][0]='';

49 }

50 }

51 main()

52 {

53 int a[4][2];

54 int i,j,min;

55 char lasthead;

56 int FLAG=0;//FLAG作为是否第一个输入案例的记号

57 while(scanf("%d%d%d%d",&a[0][0],&a[1][0],&a[2][0],&a[3][0])&&(a[0][0]||a[1][0]||a[2][0]||a[3][0]))

58 {

59 count=0;

60 //每个数字串先初始化

61 for(i=0;i<24;i++)

62 num[i][0]=num[i][4]='';

63 //先对所得的卡片升序排序

64 for(i=0;i<3;i++)

65 {

66 min=i;

67 for(j=i+1;j<4;j++)

68 {

69 if(a[min][0]>a[j][0])

70 min=j;

71 }

72 swap(&a[min][0],&a[i][0]);

73 }

74 //全部标记为可用

75 for(i=0;i<4;i++)

76 a[i][1]=1;

77 //逐个输出

78 getnum(a,1);

79 //去重

80 delrepeat();

81 lasthead='a';

82 if(FLAG!=0)

83 putchar(' ');

84 FLAG=1;

85 for(i=0;i<24;i++)

86 {

87 if(strlen(num[i])==0 )

88 continue;

89 if(lasthead!=num[i][0] && lasthead!='a')

90 putchar(' ');

91 printf(lasthead==num[i][0]?" %s":"%s",num[i]);

92 lasthead=num[i][0];

93 }

94 printf(" ");

95 }

96 }







 

转载于:https://www.cnblogs.com/ZShogg/archive/2012/04/05/2432227.html

更多相关:

  • 题目:找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 限制: 2 <= n...

  •   罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符          数值 I             1 V             5 X             10 L             50 C             100 D             500 M            ...

  • Word2007中为数字加上下标的几种方法: 一:通过插入>公式>>选择,通过此上下标。 二:写下数字,例如5,然后按ctrl+shift+=号三个键,就可添加上标,按ctrl+=号两键,就可标注下标。 三、开始菜单中的X2,X2 转载于:https://www.cnblogs.com/jufu/archive/2012/03/3...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。 注意: num 的长度小于 10002 且 ≥ k。 num 不会包含任何前导零。 示例 1 : 输入: num = “1432219”, k = 3 输出: “1219” 解释: 移除掉三个数字 4, 3, 和 2形成一个新的最小的数...

  • 代码展示:   http://paste.ubuntu.com/23693598/ #include #include #include char * largeDiffer(char *a,char *b){ /*  使用说明 传入的a和b只能为整数 结果为a-b;返回...

  • Description We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long time. But recently, it is reported that he hides in Hang Zhou of Ch...

  • /*Name: NYOJ--811--变态最大值Author: shen_渊 Date: 17/04/17 15:49Description: 看到博客上这道题浏览量最高,原来的代码就看不下去了 o(╯□╰)o */#include #include #include u...

  • 生成唯一号:思路,根据yymmddhhmmss+自增长号+唯一服务器号( SystemNo)生成唯一码,总长度19,例如:1509281204550000101. public class UniqueNumber {     private static long num = 0;//流水号     private sta...