题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495点击打开链接
非常可乐
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14910 Accepted Submission(s): 5971
Problem Description
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。
Input
三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。
Output
如果能平分的话请输出最少要倒的次数,否则输出"NO"。
Sample Input
7 4 3 4 1 3 0 0 0
Sample Output
NO 3
Author
seeyou
广搜 同时注意标记 因为两个状态确定 第三个状态随之也确定 因此用二维数组就能储存 更加简便
代码有些冗长 分情况讨论
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include<algorithm>
#include <math.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <queue>
#include <stack>
using namespace std;
struct xjy
{
int i;
int j;
int k;
int number;
};
int b[4];
int book[111][111];
int n;int m;int s;
int num=0;
void bfs()
{
book[s][0]=1;
int q,w,e;
q=s;w=0;e=0;
xjy mid;xjy midmid;
mid.i=q;mid.j=w;mid.k=e;mid.number=0;
queue <xjy> qu;
qu.push(mid);
while(!qu.empty())
{
mid=qu.front();
qu.pop();
if(((mid.i+mid.j)==s&&mid.i==mid.j)||((mid.i+mid.k)==s&&mid.i==mid.k)||((mid.k+mid.j)==s&&mid.k==mid.j))
{
num=mid.number;
break;
};
if(mid.i>=(b[2]-mid.j))
{
midmid=mid;
midmid.i=midmid.i-b[2]+midmid.j;
midmid.j=b[2];
midmid.number++;
if(book[midmid.i][midmid.j]!=1)
{
qu.push(midmid);
book[midmid.i][midmid.j]=1;
}
}
if(mid.i<(b[2]-mid.j))
{
midmid=mid;
midmid.j+=midmid.i;
midmid.i=0;
midmid.number++;
if(book[midmid.i][midmid.j]!=1)
{
qu.push(midmid);
book[midmid.i][midmid.j]=1;
}
}
if(mid.i>=(b[3]-mid.k))
{
midmid=mid;
midmid.i=midmid.i-b[3]+midmid.k;
midmid.k=b[3];
midmid.number++;
if(book[midmid.i][midmid.j]!=1)
{
qu.push(midmid);
book[midmid.i][midmid.j]=1;
}
}
if(mid.i<(b[3]-mid.k))
{
midmid=mid;
midmid.k+=midmid.i;
midmid.i=0;
midmid.number++;
if(book[midmid.i][midmid.j]!=1)
{
qu.push(midmid);
book[midmid.i][midmid.j]=1;
}
}
if(mid.j>=(b[3]-mid.k))
{
midmid=mid;
midmid.j=midmid.j-b[3]+midmid.k;
midmid.k=b[3];
midmid.number++;
if(book[midmid.i][midmid.j]!=1)
{
qu.push(midmid);
book[midmid.i][midmid.j]=1;
}
}
if(mid.j<(b[3]-mid.k))
{
midmid=mid;
midmid.k+=midmid.j;
midmid.j=0;
midmid.number++;
if(book[midmid.i][midmid.j]!=1)
{
qu.push(midmid);
book[midmid.i][midmid.j]=1;
}
}
if(mid.j>=(b[1]-mid.i))
{
midmid=mid;
midmid.j=midmid.j-b[1]+midmid.i;
midmid.i=b[1];
midmid.number++;
if(book[midmid.i][midmid.j]!=1)
{
qu.push(midmid);
book[midmid.i][midmid.j]=1;
}
}
if(mid.j<(b[1]-mid.i))
{
midmid=mid;
midmid.i+=midmid.j;
midmid.j=0;
midmid.number++;
if(book[midmid.i][midmid.j]!=1)
{
qu.push(midmid);
book[midmid.i][midmid.j]=1;
}
}
if(mid.k>=(b[1]-mid.i))
{
midmid=mid;
midmid.k=midmid.k-b[1]+midmid.i;
midmid.i=b[1];
midmid.number++;
if(book[midmid.i][midmid.j]!=1)
{
qu.push(midmid);
book[midmid.i][midmid.j]=1;
}
}
if(mid.k<(b[1]-mid.i))
{
midmid=mid;
midmid.i+=midmid.k;
midmid.k=0;
midmid.number++;
if(book[midmid.i][midmid.j]!=1)
{
qu.push(midmid);
book[midmid.i][midmid.j]=1;
}
}
if(mid.k>=(b[2]-mid.j))
{
midmid=mid;
midmid.k=midmid.k-b[2]+midmid.j;
midmid.j=b[2];
midmid.number++;
if(book[midmid.i][midmid.j]!=1)
{
qu.push(midmid);
book[midmid.i][midmid.j]=1;
}
}
if(mid.k<(b[2]-mid.j))
{
midmid=mid;
midmid.j+=midmid.k;
midmid.k=0;
midmid.number++;
if(book[midmid.i][midmid.j]!=1)
{
qu.push(midmid);
book[midmid.i][midmid.j]=1;
}
}
}
}
int main()
{
while(scanf("%d%d%d",&s,&n,&m)&&s&&n&&m)
{
if(n<m)
{
int t=n;
n=m;
m=t;
}
num=0;
b[1]=s;
b[2]=n;
b[3]=m;
for(int i=0;i<111;i++)
for(int j=0;j<111;j++)
book[i][j]=0;
bfs();
if(num)
printf("%d\n",num);
else
printf("NO\n");
}
}
这次比赛又碰到了 附一下这次的吧 代码差不多
#include <iostream>
#include <queue>
#include <stdio.h>
#include <stdlib.h>
#include <stack>
#include <limits.h>
#include <string>
#include <string.h>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <math.h>
using namespace std;
char mmap[11][11];
int book[111][111][111];
struct xjy
{
int nv;
int mv;
int kv;
};
int ans=INT_MAX;
xjy b,e;
int n,m,k;
int num;
int cnt;
queue <xjy > q;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
void bfs()
{
while(!q.empty())
q.pop();
xjy mid;
mid.nv=n;
mid.mv=0;
mid.kv=0;
q.push(mid);
while(!q.empty())
{
mid=q.front();
q.pop();
if(((mid.nv==mid.mv)&&mid.nv==n/2)||((mid.kv==mid.mv)&&mid.mv==n/2)||((mid.nv==mid.kv)&&mid.nv==n/2))
{
ans=book[mid.nv][mid.mv][mid.kv];
break;
}
//cout << mid.nv<<" "<< mid.mv << " "<< mid.kv << endl;
xjy midmid;
midmid=mid;
if(midmid.nv!=0||midmid.mv!=m)
{
if(midmid.nv>(m-midmid.mv))
{
midmid.nv-=(m-midmid.mv);
midmid.mv=m;
if(!book[midmid.nv][midmid.mv][midmid.kv])
{
q.push(midmid);
book[midmid.nv][midmid.mv][midmid.kv]=book[mid.nv][mid.mv][mid.kv]+1;
}
}
else
{
midmid.mv+=midmid.nv;
midmid.nv=0;
if(!book[midmid.nv][midmid.mv][midmid.kv])
{
q.push(midmid);
book[midmid.nv][midmid.mv][midmid.kv]=book[mid.nv][mid.mv][mid.kv]+1;
}
}
}
midmid=mid;
if(midmid.nv!=0||midmid.kv!=k)
{
if(midmid.nv>(k-midmid.kv))
{
midmid.nv-=(k-midmid.kv);
midmid.kv=k;
if(!book[midmid.nv][midmid.mv][midmid.kv])
{
q.push(midmid);
book[midmid.nv][midmid.mv][midmid.kv]=book[mid.nv][mid.mv][mid.kv]+1;
}
}
else
{
midmid.kv+=midmid.nv;
midmid.nv=0;
if(!book[midmid.nv][midmid.mv][midmid.kv])
{
q.push(midmid);
book[midmid.nv][midmid.mv][midmid.kv]=book[mid.nv][mid.mv][mid.kv]+1;
}
}
}
midmid=mid;
if(midmid.mv!=0||midmid.kv!=k)
{
if(midmid.mv>(k-midmid.kv))
{
midmid.mv-=(k-midmid.kv);
midmid.kv=k;
if(!book[midmid.nv][midmid.mv][midmid.kv])
{
q.push(midmid);
book[midmid.nv][midmid.mv][midmid.kv]=book[mid.nv][mid.mv][mid.kv]+1;
}
}
else
{
midmid.kv+=midmid.mv;
midmid.mv=0;
if(!book[midmid.nv][midmid.mv][midmid.kv])
{
q.push(midmid);
book[midmid.nv][midmid.mv][midmid.kv]=book[mid.nv][mid.mv][mid.kv]+1;
}
}
}
midmid=mid;
if(midmid.mv!=0||midmid.nv!=n)
{
if(midmid.mv>(n-midmid.nv))
{
midmid.mv-=(n-midmid.nv);
midmid.nv=n;
if(!book[midmid.nv][midmid.mv][midmid.kv])
{
q.push(midmid);
book[midmid.nv][midmid.mv][midmid.kv]=book[mid.nv][mid.mv][mid.kv]+1;
}
}
else
{
midmid.nv+=midmid.mv;
midmid.mv=0;
if(!book[midmid.nv][midmid.mv][midmid.kv])
{
q.push(midmid);
book[midmid.nv][midmid.mv][midmid.kv]=book[mid.nv][mid.mv][mid.kv]+1;
}
}
}
midmid=mid;
if(midmid.kv!=0||midmid.mv!=m)
{
if(midmid.kv>(m-midmid.mv))
{
midmid.kv-=(m-midmid.mv);
midmid.mv=m;
if(!book[midmid.nv][midmid.mv][midmid.kv])
{
q.push(midmid);
book[midmid.nv][midmid.mv][midmid.kv]=book[mid.nv][mid.mv][mid.kv]+1;
}
}
else
{
midmid.mv+=midmid.kv;
midmid.kv=0;
if(!book[midmid.nv][midmid.mv][midmid.kv])
{
q.push(midmid);
book[midmid.nv][midmid.mv][midmid.kv]=book[mid.nv][mid.mv][mid.kv]+1;
}
}
}
midmid=mid;
if(midmid.kv!=0||midmid.nv!=n)
{
if(midmid.kv>(n-midmid.nv))
{
midmid.kv-=(n-midmid.nv);
midmid.nv=n;
if(!book[midmid.nv][midmid.mv][midmid.kv])
{
q.push(midmid);
book[midmid.nv][midmid.mv][midmid.kv]=book[mid.nv][mid.mv][mid.kv]+1;
}
}
else
{
midmid.nv+=midmid.kv;
midmid.kv=0;
if(!book[midmid.nv][midmid.mv][midmid.kv])
{
q.push(midmid);
book[midmid.nv][midmid.mv][midmid.kv]=book[mid.nv][mid.mv][mid.kv]+1;
}
}
}
}
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&k)&&(n||m||k))
{
memset(book,0,sizeof(book));
ans=INT_MAX;
book[n][0][0]=1;
if(n&1)
{
printf("NO\n");
continue;
}
else
{
bfs();
if(ans!=INT_MAX)
printf("%d\n",ans-1);
else
printf("NO\n");
}
}
}