比赛 20121106 评测结果 AAAAAAAA
题目名称 过河 最终得分 100
用户昵称 苏轼 运行时间 0.320 s
代码语言 C++ 内存使用 9.04 MiB
提交时间 2012-11-06 11:51:53
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<utility>
#include<algorithm>
using namespace std;
int n,w[1005][3],f[11]={0},sum=1,ff[11]={-5,-4,-3,-2,-1,0,1,2,3,4,5};
bool maxn[1005][6000]={0};
queue<pair<int,int> >q;
int tmp,tt,ttt;
void bfs();
int main()
{
	freopen ("rivera.in","r",stdin);
	freopen ("rivera.out","w",stdout);
	cin>>n;
	for (int i=1;i<=n;i++)
	{
		cin>>w[i][0]>>w[i][1];
		w[i][2]=w[i][0]+w[i][1];
		f[w[i][2]]=1;
	}
	/*for (int i=10;i>=2;i--)
	{
		for (int j=i-1;j>=2;j--)
		{
			if (f[i]&&f[j]&&i!=j)
			{
				if (i%j==0)
					f[j]=0;
			}
		}
	}
	for (int i=2;i<=10;i++)
	{
		if (f[i])
			sum*=i;
	}*/
	bfs();
	cout<<"NO";
	return 0;
}

void bfs()
{
	pair<int,int>temp;
	temp.first=0;
	temp.second=0;
	q.push(temp);
	maxn[0][0]=1;
	while (!q.empty())
	{
		for (int i=0;i<11;i++)
		{
			tmp=q.front().first+ff[i];
			tt=q.front().second+1;
			if (tt>6000)
				return;
			if (tmp==n+1)
			{
				cout<<tt;
				exit(0);
			}
			if (tmp==0)
			{
				if (!maxn[tmp][tt])
				{
					temp.first=tmp;
					temp.second=tt;
					q.push(temp);
					maxn[tmp][tt]=1;
				}
			}
			if (tmp>0&&tmp<=n)
			{
				ttt=tt%(w[tmp][2]);
				if (ttt>=1&&ttt<=w[tmp][0]&&!maxn[tmp][tt])
				{
					temp.first=tmp;
					temp.second=tt;
					q.push(temp);
					maxn[tmp][tt]=1;
					
				}
			}
		}
		q.pop();
	}
}