POJ1731

Posted 幻觉czw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ1731相关的知识,希望对你有一定的参考价值。

<pre name="code" class="cpp">#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int func(string& input,int start,int last) 

	int left = start;
	int right = last;
	char key = input[left];
	while (left < right) 
		while (left < right && input[right] >= key)
			-- right;
		swap(input[left],input[right]);
		while (left < right && input[left] <= key)
			++ left;
		swap(input[left],input[right]);
	
	return left;

void quicksort(string& input,int start,int last)

	if (start < last) 
		int q = func(input,start,last);
		quicksort(input,start,q - 1);
		quicksort(input,q + 1,last);
	

void permutation (string input)

	cout<<input<<"\\n";//输出原序列(升序)
	while (true) 
		int idx = -1;
		for (int i = input.size() - 1; i >= 1; -- i) 
			if (input[i - 1] < input[i])  //从后面向前搜索,找到第一个升序
				idx = i - 1;//记下索引
				break;
			 
		
		if ( idx == -1 ) break; //如果还是-1就证明意识降序,所有排列都已输出,就跳出循环
		char Z = 'z';
		int temp = 0;
		//从后向前搜,找到比input[idx]大的最小的那个字符
		for (int j = input.size() - 1;j > temp; -- j) 
			if (input[j] <= input[idx]) continue;
			if (input[j] < Z) 
				temp = j;
				Z = input[j];
			
		
		swap(input[idx],input[temp]);//交换这两个字符
		int len = input.size() - 1 - idx;
		//逆序input[idx]之后的字符
		for (int k = 1; k <= (len/2); ++ k) 
			swap(input[idx+k],input[input.size()-k]);
		
		cout<<input<<"\\n";
	


int main ()

	string str = "";
	cin>>str;
	quicksort(str,0,str.size() - 1);
	permutation(str);


以上是关于POJ1731的主要内容,如果未能解决你的问题,请参考以下文章

poj 1731 Orders

POJ1731

poj2481树状数组解二维偏序

sql 升序降序排列

oracle 默认是升序还是降序

sql查询降序和升序的问题