组合数学实验——从逆序列构造一个排列

同前几篇博客

算法:组合数学中文第4版 机械工业出版社 P59

//////////////////////////////////////////////
//                                          //
//  Project Name: converse                  //
//                                          //
//  File Name: converse.h                   //
//                                          //
//  Author: Victor Zhang                    //
//                                          //
//  ID: 21*****92                           //
//                                          //
//  Create Date: March 30. 2009             //
//                                          //
//////////////////////////////////////////////

#include <fstream>

#ifndef CONVERSE_H
#define CONVERSE_H

#define MAXLEN 90000

class Converse
{
private:
	int data[MAXLEN][2];
	int count;
public:
	Converse(int = 0);
	~Converse()
	{
		int i = 0;
		count = 0;
		for (i = 0; i < MAXLEN; i++)
		{
			data[i][1] = data[i][0] = 0;
		};
	};
	void Initialize(int = 0);
	void print();
	void process();
};

#endif
//////////////////////////////////////////////
//                                          //
//  Project Name: converse                  //
//                                          //
//  File Name: converse.cpp                 //
//                                          //
//  Author: Victor Zhang                    //
//                                          //
//  ID: 21*****92                           //
//                                          //
//  Create Date: March 30. 2009             //
//                                          //
//////////////////////////////////////////////

#include <iostream>
#include <fstream>

using namespace std;

#include "converse.h"

Converse::Converse(int n)
{
	this->Initialize(n);
};

void Converse::Initialize(int n)
{
	if (!(n)) n = 0;
	for (int i = 0; i < MAXLEN; i++)
	{
		if (i < n)
			this->data[i][1] = this->data[i][0] = 0;
		else
			this->data[i][1] = this->data[i][0] = -1;
	};
	this->count = n;
};

void Converse::process()
{
	fstream file ("con_data.txt", ios::out);
	if (!file) cout<<"Error in creating data file(con_data.txt).";
	int i = 0;
	int j = 0;
	int tmp = 0;
	while (1)
	{
		for (i = 0; i < (this->count); i++)
		{
			tmp = 0;
			j = (1 + this->data[i][1]);
			while (j)
			{
				if (this->data[tmp][0] == 0) j--;
				tmp++;
			};
			tmp--;
			this->data[tmp][0] = (i + 1);
		};
		//print
		if (!file)
		{
		}
		else
		{
			if (!(this->count)) file<<"<Empty>";
			else
			{
				for (int i = 0; i < this->count; i++)
					file<<this->data[i][0]<<" ";
			};
			file<<endl;
		};
		this->print();
		//~print
		//change
		for (i = 0; i < this->count; i++)
			this->data[i][0] = 0;
		i = 0;
		while ((this->data[i][1] >= (this->count - i -1)) && i < this->count)
		{
			this->data[i][1] = -1;
			i++;
		};
		if (this->data[i][1] == -1) return;
		this->data[i][1] += 1;
		i--;
		while (i >= 0)
		{
			this->data[i][1] = 0;
			i--;
		};
	};
	//~change
	file.close();
};

void Converse::print()
{
	if (!(this->count)) cout<<"<Empty>";
	else
	{
		for (int i = 0; i < this->count; i++)
			cout<<this->data[i][0]<<" ";
	};
	cout<<endl;
};
//////////////////////////////////////////////
//                                          //
//  Project Name: converse                  //
//                                          //
//  File Name: main.cpp                     //
//                                          //
//  Author: Victor Zhang                    //
//                                          //
//  ID: 21*****92                           //
//                                          //
//  Create Date: March 30. 2009             //
//                                          //
//////////////////////////////////////////////

#include <iostream>

using namespace std;

#include "converse.h"

void main()
{
	cout<<"Please input a number(Max 90000):";
	int i;
	cin>>i;
	if (i > 90000) i = 90000;
	Converse a(i);
	a.process();
};

你可能感兴趣的:(排列,组合数学)