USACO3.2 Spinning Wheels(spin)

       個人USACO第50題,一個98年ACM區域賽的題,談不上什麼算法,模擬求解。s[i][j][0]表示第i個輪子上第j個缺口的起始角度,s[i][j][1]表示第i個輪子上第j個缺口的長度。時間每增長1s,檢測光線是否能夠穿過全部的輪子,若是是則輸出結果結束;若是否,檢測將本次每一個輪子的第一個缺口的起始角度是否之前曾出現過,若是是,則問題進入死循環,不可能有光線穿過五個輪子,輸出"none"結束;若是否,則將本次每一個輪子的第一個缺口的起始角度存進vec,ans++,繼續循環。這裏題目中說0~180的長度是181,可是編程中若是這樣處理則會錯誤,例如題目中給出的測試例結果爲9,此時第三個輪子的缺口起始角度爲90,長度爲180,按題中的意思,最多能達到的角度爲90+180-1=269,可是答案光線倒是270度,依此,在編程中作出了適當修改。node

        修改了題意,抱着試試的態度提交,居然一次經過,並且用時還能夠,激動啊激動,很久沒WORKED FIRST TIME了,難道是爲了記念個人USACO50題?留下截圖,以做記念。ios

USER: jinzhou lee [jzzlee1]
TASK: spin
LANG: C++

Compiling...
Compile: OK

Executing...
   Test 1: TEST OK [0.000 secs, 3340 KB]
   Test 2: TEST OK [0.000 secs, 3340 KB]
   Test 3: TEST OK [0.000 secs, 3340 KB]
   Test 4: TEST OK [0.000 secs, 3340 KB]
   Test 5: TEST OK [0.000 secs, 3340 KB]
   Test 6: TEST OK [0.011 secs, 3340 KB]
   Test 7: TEST OK [0.011 secs, 3340 KB]
   Test 8: TEST OK [0.032 secs, 3340 KB]

All tests OK.

YOUR PROGRAM ('spin') WORKED FIRST TIME! That's fantastic -- and a rare thing. Please accept these special automated congratulations.算法

 

/*
ID:jzzlee1
PROB:spin
LANG:C++
*/
//#include<iostream>
#include<fstream>
#include<cmath>
#include<vector>
using namespace std;
ifstream cin("spin.in");
ofstream cout("spin.out");
int ans,v[5],w[5],s[5][5][2];
struct node
{
	short a;
	short b;
	short c;
	short d;
	short e;
};
vector<node> vec;
bool checkok()
{
	bool flag,sign;
	for(int k=0;k!=360;k++)
	{
		sign=1;
		for(int i=0;i!=5;i++)
		{
			flag=0;
			for(int j=0;j!=w[i];j++)
			{
				if(s[i][j][0]+s[i][j][1]-1<360)
				{
					if(k>=s[i][j][0]&&k-s[i][j][0]<=s[i][j][1])
					{
						flag=1;
						break;
					}
				}
				else
				{
					if(k<s[i][j][0])
					{
						if(k+360-s[i][j][0]<s[i][j][1])
						{
							flag=1;
							break;
						}
					}
					else
					{
						if(k-s[i][j][0]<s[i][j][1])
						{
							flag=1;
							break;
						}
					}
				}
			}
			if(!flag)
				sign=0;
		}
		if(sign)
		return 1;
	}
	return 0;
}
bool checkfail()
{
	vector<node>::iterator iter;
	for(iter=vec.begin();iter!=vec.end();iter++)
	{
		if(iter->a!=s[0][0][0])
			continue;
		if(iter->b!=s[1][0][0])
			continue;
		if(iter->c!=s[2][0][0])
			continue;
		if(iter->d!=s[3][0][0])
			continue;
		if(iter->e!=s[4][0][0])
			continue;
		return 1;
	}
	return 0;
}
int main()
{
	int i,j;
	for(i=0;i!=5;i++)
	{
		cin>>v[i]>>w[i];
		for(j=0;j!=w[i];j++)
		{
			cin>>s[i][j][0]>>s[i][j][1];
		}
	}
	while(1)
	{
		if(checkok())
		{
			cout<<ans<<endl;
			break;
		}
		for(i=0;i!=5;i++)
			for(j=0;j!=w[i];j++)
			s[i][j][0]=(s[i][j][0]+v[i])%360;
		node dd;
		dd.a=s[0][0][0];
		dd.b=s[1][0][0];
		dd.c=s[2][0][0];
		dd.d=s[3][0][0];
		dd.e=s[4][0][0];
		if(checkfail())
		{
			cout<<"none"<<endl;
			break;
		}
		vec.push_back(dd);
		ans++;
	}
	return 0;
}
相關文章
相關標籤/搜索