491
windows
D的小L---全排列
D的小L 时间限制:4000 ms | 内存限制:65535 KB 难度:2 描述 一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给匡匡出了个题目想难倒匡匡(小L很D吧),有一个数n(0<n<10),写出1到n的全排列,这时匡匡有点囧了,,,聪明的你能帮匡匡解围吗? 输入 第一行输入一个数N(0<N<10),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个整数x(0<x<10) 输出 按特定顺序输出所有组合。 特定顺序:每一个组合中的值从小到大排列,组合之间按字典序排列。 样例输入 2 2 3 样例输出 12 21 123 132 213 231 312 321 查看代码---运行号:253085----结果:Accepted 运行时间:2012-10-07 20:48:25 | 运行人:huangyibiao view sourceprint? 01.#include <iostream> 02. 03.usingnamespacestd; 04. 05.voidPrintElems(int*elem, int size) 06.{ 07.for(inti = 1; i <= size; i++) 08.cout << elem[i]; 09.cout << endl; 10.} 11. 12.voidSwap(int&first, int &second) 13.{ 14.inttmp = first; 15.first = second; 16.second = tmp; 17.} 18. 19.voidReverse(int*elem, int leftIndex,int size) 20.{ 21.for(inti = leftIndex, j = size; j >= i; i++, j--) 22.{ 23.Swap(elem[i], elem[j]); 24.} 25. 26.} 27. 28.boolNotFinished(int*elem, int size) 29.{ 30. 31.//从右往左寻找第一个相邻元素中左边元素小于右边的元素的位置 32.intleftIndex = -1; 33.for(inti = size; i >= 2; i--)//0号不用 34.{ 35.if(elem[i-1] < elem[i]) 36.{ 37.leftIndex = i-1; 38.break; 39.} 40.}//******************************************************* 41.if(leftIndex == -1)//找不到了,说明已经全部排完 42.{ 43.returnfalse; 44.} 45. 46.//从右往左寻找右边的元素中大于前面已经找到的元素的最小元素的位置 47.intrightIndex = -1; 48.for(inti = size; i >= leftIndex; i--) 49.{ 50.if(elem[i] > elem[leftIndex]) 51.{ 52.rightIndex = i; 53.break; 54.} 55.} 56.//交换这两个元素 57.Swap(elem[leftIndex], elem[rightIndex]); 58. 59.Reverse(elem, leftIndex+1, size); 60. 61.returntrue; 62.} 63. 64.intmain() 65.{ 66.intsample; 67.cin >> sample; 68. 69.while(sample--) 70.{ 71.intx; 72.cin >> x; 73.int*elem =new int[x+1]; 74. 75.for(inti = 0; i <= x; i++) 76.elem[i] = i; 77.while(true) 78.{ 79.PrintElems(elem, x); 80.if(!NotFinished(elem, x)) 81.break; 82.} 83. delete []elem; 84.} 85.return0; 86.}
最后更新:2017-04-02 15:14:56