码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1495 非常可乐

时间:2015-05-19 16:43:19      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

看了别人的许多代码,长的让人发指,感觉70行就能搞定的代码写了上百行?...

6种情况可以用循环解决

#include<iostream>
#include<queue>
#include<cstring>
#define maxn 100+5
using namespace std;
int n[3];
int vs;
int visit[maxn][maxn][maxn];//三位数组记录有木有走过 
int dir[6][3]={{0,1,2},{1,0,2},{1,2,0},{2,1,0},{0,2,1},{2,0,1}};
int flag;
struct stu
{
	int v[3];//0表示s,1,2分别表示n,m,之所以这样,是因为方便之后用循环处理6种情况 
	int sum;
};
void bfs()
{
	stu x,y;
	queue<stu>mapp;
	x.v[0]=n[0];x.v[1]=0;x.v[2]=0,x.sum=0;
	mapp.push(x);
	while(mapp.size())
	{
		x=mapp.front();
		mapp.pop();
		if((x.v[0]==x.v[1]&&x.v[1]==vs)||(x.v[0]==x.v[2]&&x.v[2]==vs)||(x.v[1]==x.v[2]&&x.v[2]==vs))
		{
			flag=0;cout<<x.sum<<endl;return;
		}
		visit[x.v[0]][x.v[1]][x.v[2]]=1;
		for(int i=0;i<6;i++)
		{
			int p=dir[i][0],q=dir[i][1],r=dir[i][2];
			int vv=x.v[p]+x.v[q];
			if(vv>n[q])
			{
				y.v[q]=n[q];
				y.v[p]=vv-n[q];
			}
			else
			{
				y.v[q]=vv;
				y.v[p]=0;
			}
			y.v[r]=x.v[r];
			y.sum=x.sum+1;
			if(visit[y.v[0]][y.v[1]][y.v[2]]) continue;
			mapp.push(y);
		}
	} 
}
int main()
{
	cin.sync_with_stdio(false);
	while(cin>>n[0]>>n[1]>>n[2]&&n[0]&&n[1]&&n[2])
	{
		if(n[0]%2)//剪个枝,因为容器都是整数,所以不可能倒出小数来 
		{
			cout<<"NO"<<endl;continue;
		}
		flag=1;
		vs=n[0]/2;
		memset(visit,0,sizeof(visit));
		bfs();
		if(flag) cout<<"NO"<<endl;
	}
	return 0;
}


 

hdu 1495 非常可乐

标签:

原文地址:http://blog.csdn.net/zafkiel_nightmare/article/details/45844561

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!