算法实验报告1 全排列和会场安排问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一全排列和会场安排问题

一、实验要求

1.全排列:要求键盘输入若干个不同的字符,然后产生并显示所有的排列

会场安排问题:

1.要求按贪心法求解问题;

2.要求读文本文件输入活动安排时间区间数据(数据在文件中的格式如下);

3.不能改变活动的编号,排序时不能移动活动的所有信息;

4.按选择顺序显示活动的编号、开始时间和结束时间。

输入数据的文本文件格式:第1行为活动个数,第2行开始每行一个活动,每个活动的数据有活动编号、开始时间、结束时间,用空格隔开。

如:data.txt

18

1 6 9

2 2 7

┋有18行

2.18 3 5

二、实验平台

1、编程环境:Microsoft Visual Studio 2010

2、运行环境:windows7

三、核心代码

全排列:

#include

#include"iostream"

using namespace std;

void Permutation(char* letter, int* record, int length, int n)

{

if ( n == length )

{

static int count = 0;

count++;

cout << count << "->:\t ";

for ( int i = 0; i < length; i++ )

{

cout << letter[record[i]];

}

cout << endl;

return;

}

for ( int i = 0; i < length; i++ )

{

//确ā?定¨当獭?前°结á点?的?字?符?是?什?么′,?不?能ü和í已?经-确ā?定¨的?字?符?相à同?

int j;

for ( j = 0; j < n; j++ )

{

if ( i==record[j] )

break;

}

if ( j != n )

continue;

//确ā?定¨当獭?前°字?符?

if ( j == n )

record[n] = i;

Permutation(letter,record,length,n+1);

}

}

int _tmain(int argc, _TCHAR* argv[])

{

char* letter = "abcd";

int length = strlen(letter);

int* record = new int[length];

Permutation(letter,record,length,0);

system("pause");

return 0;

}

会场安排问题(贪心算法):

#include

#include

using namespace std;

#define N 50

#define TURE 1

#define FALSE 0

int Partition(int *b,int *a,int p,int r);

void QuickSort(int *b,int *a,int p,int r);

int A[N];

void GreedySelector(int n,int start[],int end[],int *A)

{

A[1]=true;

int j=1;

for(int i=2;i<=n;i++)

{

if(start[i]>=end[j])

{

A[i]=true;

j=i;

}

else A[i]=false;

}

}

//快ì速ù排?序î

void QuickSort(int *b,int *a,int p,int r)

{

int q;

if(p

{

q=Partition(b,a,p,r);

QuickSort(b,a,p,q-1);/*对?左哩?半?段?排?序î*/

QuickSort(b,a,q+1,r);/*对??半?段?排?序î*/ }

}

//中D间?数簓

int Partition(int *b,int *a,int p,int r)

{

int k,m,y,i=p,j=r+1;

int x=a[p];y=b[p];

while(1) {

while(a[++i]

while(a[--j]>x);

if(i>=j) break;

else {

k=a[i];

a[i]=a[j];

a[j]=k;

m=b[i];

b[i]=b[j];

b[j]=m;

}

}

a[p]=a[j];

b[p]=b[j];

a[j]=x;

b[j]=y;

return j;

}

int main()

{

fstream fin;

fin.open("input.txt",ios::in);

cout<<"在input.txt文件中输入数据,数据格式为:第1行为活动个数,第2行开始每行一个活动,每个活动的数据有活动编号,开始时间,结束时间,用空格隔开\n如:\n18\n1 6 9\n2 2 7\n.\n.\n.\n18 3 5\n\n";

if(fin.fail())

{

cout<<"文件不存在!"<

cout<<"退出程序..."<

return 0;

}

int n;

fin>>n;

int *a=new int[n];

int *b=new int[n];

int *c=new int[n];

for(int i=0;i<=n;i++)

{

fin>>a[i];

fin>>b[i];

fin>>c[i];

}

QuickSort(b,c,1,n);//按恪?结á束?时骸?间?非?减?序î排?

printf(":\n"); /*输?出?排?序î结á果?*/

printf("\n 序号\t开始时间结束时间\n");

printf("-------------------------\n");

for(int i=2;i<=n;i++)

printf(" %d\t %d\t %d\n",i,b[i],c[i]);

printf("-------------------------\n");

GreedySelector(n,b,c,A);

printf("安排的活动序号依次为:");

for(int i=2;i<=n;i++)

{

if(A[i]) printf("\n%d %d-->%d",i,b[i],c[i]);

相关文档
最新文档