算法实验报告1 全排列和会场安排问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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]);