寒假作业2_电梯
目前想法:
2月9日更新
暴力回溯搜索嵌套,遍历所有载客顺序 载客方案 记录最优解
把5个输入数据看成5名乘客,用回溯生成5名乘客的接客顺序
然后按照生成的顺序去载客,载客后有两种选择,一是去下个预订地方进行载客,二是送当前电梯里的一名客
送完客有两种选择,一是如果电梯内还有客人送一名客人,二是去下个地方载客
写了好久,现在在送客的子函数出了bug 后面再写
2月11日更新
还没完成 现在的框架都还没搭好 得不到想要的输出
deadline马上到了 未完成品也不好意思交github 就把未完成品放在这了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<math.h>
#define NUMM 3
using namespace std;
int inorder[NUMM*2];
int tmptime=0;
int tmptottime=0;
int result_time=0x7fffffff;
bool usedorder[NUMM*2];
struct data
{
int num,time,from,to;
}wait[NUMM*2],on[NUMM*2],deliver[NUMM*2];
void print(data p)
{
cout<<"num="<<p.num<<"\ttime="<<p.time<<"\tfrom="<<p.from<<"\tto="<<p.to<<endl;
return ;
}
bool delivered[NUMM*2];
int waitnum;
void solve2(int k,int floor,int onnum,int dn);
void solve3 (int k,int floor,int onnum,int dn,int tmpnum)//回溯 送电梯的客
{
for(int i=1;i<=tmpnum;i++)
{
if(!delivered[i])
{
onnum--;dn++;
cout<<"送"<<on[i].num<<"\t"<<onnum<<endl;
delivered[i]=true;
solve3(k,floor,onnum,dn,tmpnum);
solve2(k+1,floor,onnum,dn);
delivered[i]=false;
dn--;
}
}
}
void solve2(int k,int floor,int onnum,int dn)//dfs 接客
{
if(k>NUMM)return ;
cout<<"接"<<inorder[k]<<"\t";
onnum++;
on[onnum]=wait[inorder[k]];
//print(wait[inorder[k]]);
if(k<NUMM)solve2(k+1,floor,onnum,dn);
memset(delivered,0,sizeof(delivered));
solve3(k,floor,onnum,dn,onnum);cout<<endl<<endl;
}
void solve1(int k)//回溯生成所有载客顺序
{
for(int i=1;i<=NUMM;i++)
{
if(!usedorder[i])
{
inorder[k]=i;
usedorder[i]=true;
if(k==NUMM)//完成生成载客顺序
{
memset(on,0,sizeof(on));
memset(deliver,0,sizeof(deliver));
memset(delivered,false,sizeof(delivered));
waitnum=NUMM;
solve2(1,1,0,0);
}
else solve1 (k+1);
usedorder[i]=false;
}
}
}
int main()
{
for(int i=1;i<=NUMM;i++)
{
cin>>wait[i].time>>wait[i].from;
int tmpto;cin>>tmpto;
if(tmpto==0)wait[i].to=10;
else wait[i].to=1;
wait[i].num=i;
}
for(int i=1;i<=NUMM;i++)
{
print(wait[i]);
}
memset(inorder,0,sizeof(inorder));
memset(usedorder,0,sizeof(usedorder));
solve1(1);
}