比赛 20121108 评测结果 AWAAAWAAAA
题目名称 造房子的学问 最终得分 80
用户昵称 苏轼 运行时间 0.032 s
代码语言 C++ 内存使用 3.31 MiB
提交时间 2012-11-08 10:45:07
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<utility>
#include<algorithm>
using namespace std;
int n,m,f[3],l,tmp;
bool used[33000]={0};
queue<pair<int,int> >q;
pair<int,int>temp;
void bfs();
int main()
{
	freopen ("wood.in","r",stdin);
	freopen ("wood.out","w",stdout);
	cin>>n>>m>>f[0]>>f[1]>>f[2]>>l;
	used[n]=1;
	bfs();
	cout<<"No solution.";
	return 0;
}

void bfs()
{
	temp.first=n;
	temp.second=0;
	q.push(temp);
	while (!q.empty())
	{
		for (int i=0;i<3;i++)
		{
			tmp=q.front().first+f[i];
			if (!used[tmp]&&tmp<=32767&&tmp>0)
			{
				used[tmp]=1;
				temp.first=tmp;
				temp.second=q.front().second+1;
				q.push(temp);
			}
			if (tmp==m)
			{
				cout<<temp.second;
				exit(0);
			}
		}
		tmp=q.front().first;
		tmp/=2;
		if (!used[tmp]&&tmp>0&&tmp<=32767)
		{
			used[tmp]=1;
			temp.first=tmp;
			temp.second=q.front().second+1;
			q.push(temp);
			if (tmp==m)
			{
				cout<<temp.second;
				exit(0);
			}
		}
		tmp=q.front().first;
		if (tmp>l&&!used[l]&&tmp>0&&tmp<=32767)
		{
			used[l]=1;
			temp.first=l;
			temp.second=q.front().second+1;
			q.push(temp);
			if (tmp==m)
			{
				cout<<temp.second;
				exit(0);
			}
		}
		if (tmp>l&&!used[tmp-l]&&tmp>0&&tmp<=32767)
		{
			used[tmp-l]=1;
			temp.first=tmp-l;
			temp.second=q.front().second+1;
			q.push(temp);
			if (tmp==m)
			{
				cout<<temp.second;
				exit(0);
			}
		}
		q.pop();
	}
}