hdu--题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495
nyoj--题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=21
hdu-1495---非常可乐
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int vis[105][105][105];
struct node
{
int x,y,z,step;
};
void bfs(int S,int N,int M)
{
node p,q;
queue<node> Q;
p.x=S;p.y=0;p.z=0;
p.step=0;
int pp=S/2;
Q.push(p);
while(!Q.empty())
{
q=Q.front();Q.pop();vis[q.x][q.y][q.z]=1;
if((q.x==pp&&q.y==pp)||(q.x==pp&&q.z==pp)||(q.z==pp&&q.y==pp))
{
printf("%d\n",q.step);return;
}
if(q.x!=0)
{
//x->y
if(q.x>N-q.y)//倒不完
{
p.x=q.x-(N-q.y);
p.y=N;
p.z=q.z;
p.step=q.step+1;
}
else//倒完
{
p.x=0;
p.y=q.x+q.y;
p.z=q.z;
p.step=q.step+1;
}
if(!vis[p.x][p.y][p.z])
{
Q.push(p);
vis[p.x][p.y][p.z]=1;
}
//x->z
if(q.x>M-q.z)//倒不完
{
p.x=q.x-(M-q.z);
p.y=q.y;
p.z=M;
p.step=q.step+1;
}
else//倒完
{
p.x=0;
p.z=q.x+q.z;
p.y=q.y;
p.step=q.step+1;
}
if(!vis[p.x][p.y][p.z])
{
Q.push(p);
vis[p.x][p.y][p.z]=1;
}
}
if(q.y!=0)
{
//y->x
if(q.y>S-q.x)//倒不完
{
p.y=q.y-(S-q.x);
p.x=S;
p.z=q.z;
p.step=q.step+1;
}
else//倒完
{
p.y=0;
p.x=q.y+q.x;
p.z=q.z;
p.step=q.step+1;
}
if(!vis[p.x][p.y][p.z])
{
Q.push(p);
vis[p.x][p.y][p.z]=1;
}
//y->z
if(q.y>M-q.z)//倒不完
{
p.y=q.y-(M-q.z);
p.x=q.x;
p.z=M;
p.step=q.step+1;
}
else//倒完
{
p.y=0;
p.x=q.x;
p.z=q.y+q.z;
p.step=q.step+1;
}
if(!vis[p.x][p.y][p.z])
{
Q.push(p);
vis[p.x][p.y][p.z]=1;
}
}
if(q.z!=0)
{
//z->y
if(q.z>N-q.y)//倒不完
{
p.z=q.z-(N-q.y);
p.y=N;
p.x=q.x;
p.step=q.step+1;
}
else//倒完
{
p.z=0;
p.y=q.z+q.y;
p.x=q.x;
p.step=q.step+1;
}
if(!vis[p.x][p.y][p.z])
{
Q.push(p);
vis[p.x][p.y][p.z]=1;
}
//z->x
if(q.z>S-q.x)//倒不完
{
p.z=q.z-(S-q.x);
p.y=q.y;
p.x=S;
p.step=q.step+1;
}
else//倒完
{
p.z=0;
p.y=q.y;
p.x=q.z+q.x;
p.step=q.step+1;
}
if(!vis[p.x][p.y][p.z])
{
Q.push(p);
vis[p.x][p.y][p.z]=1;
}
}
}
printf("NO\n");
return;
}
int main()
{
int N,M,S;
while(scanf("%d%d%d",&S,&N,&M),S,N,M)
{
memset(vis,0,sizeof(vis));
if(S%2) printf("NO\n");
else bfs(S,N,M);
}
}
nyoj---21--三个水杯
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int vis[105][105][105];
struct node
{
int x,y,z,step;
};
int N,M,S,a,b,c;
int bfs()
{
node p,q;
queue<node> Q;
memset(vis,0,sizeof(vis));
p.x=S;
p.y=0;
p.z=0;
p.step=0;
Q.push(p);
while(!Q.empty())
{
q=Q.front();Q.pop();
vis[q.x][q.y][q.z]=1;
if(q.x==a&&q.y==b&&q.z==c)
{
return q.step;
}
if(q.x!=0)
{
//x->y
if(q.x>N-q.y)//倒不完
{
p.x=q.x-(N-q.y);
p.y=N;
p.z=q.z;
p.step=q.step+1;
}
else//倒完
{
p.x=0;
p.y=q.x+q.y;
p.z=q.z;
p.step=q.step+1;
}
if(!vis[p.x][p.y][p.z])
{
Q.push(p);
vis[p.x][p.y][p.z]=1;
}
//x->z
if(q.x>M-q.z)//倒不完
{
p.x=q.x-(M-q.z);
p.y=q.y;
p.z=M;
p.step=q.step+1;
}
else//倒完
{
p.x=0;
p.z=q.x+q.z;
p.y=q.y;
p.step=q.step+1;
}
if(!vis[p.x][p.y][p.z])
{
Q.push(p);
vis[p.x][p.y][p.z]=1;
}
}
if(q.y!=0)
{
//y->x
if(q.y>S-q.x)//倒不完
{
p.y=q.y-(S-q.x);
p.x=S;
p.z=q.z;
p.step=q.step+1;
}
else//倒完
{
p.y=0;
p.x=q.y+q.x;
p.z=q.z;
p.step=q.step+1;
}
if(!vis[p.x][p.y][p.z])
{
Q.push(p);
vis[p.x][p.y][p.z]=1;
}
//y->z
if(q.y>M-q.z)//倒不完
{
p.y=q.y-(M-q.z);
p.x=q.x;
p.z=M;
p.step=q.step+1;
}
else//倒完
{
p.y=0;
p.x=q.x;
p.z=q.y+q.z;
p.step=q.step+1;
}
if(!vis[p.x][p.y][p.z])
{
Q.push(p);
vis[p.x][p.y][p.z]=1;
}
}
if(q.z!=0)
{
//z->y
if(q.z>N-q.y)//倒不完
{
p.z=q.z-(N-q.y);
p.y=N;
p.x=q.x;
p.step=q.step+1;
}
else//倒完
{
p.z=0;
p.y=q.z+q.y;
p.x=q.x;
p.step=q.step+1;
}
if(!vis[p.x][p.y][p.z])
{
Q.push(p);
vis[p.x][p.y][p.z]=1;
}
//z->x
if(q.z>S-q.x)//倒不完
{
p.z=q.z-(S-q.x);
p.y=q.y;
p.x=S;
p.step=q.step+1;
}
else//倒完
{
p.z=0;
p.y=q.y;
p.x=q.z+q.x;
p.step=q.step+1;
}
if(!vis[p.x][p.y][p.z])
{
Q.push(p);
vis[p.x][p.y][p.z]=1;
}
}
}
return -1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d%d%d",&S,&N,&M,&a,&b,&c);
printf("%d\n",bfs());
}
}
/*45
6 3 1
6 0 0
84 62 13
51 20 13
71 54 47
17 7 47
85 48 23
15 48 22
84 68 19
44 21 19
75 46 3
65 7 3
70 57 20
6 44 20
49 31 15
6 31 12
88 53 32
16 53 19
56 31 18
29 9 18
96 56 43
25 28 43
93 83 48
0 45 48
60 27 14
23 27 10
70 60 9
10 51 9
82 34 12
66 4 12
87 64 51
13 64 10
66 48 14
62 0 4
86 74 21
43 22 21
99 47 23
85 0 14
68 29 3
62 3 3
54 53 1
10 43 1
95 79 75
91 0 4
84 7 5
72 7 5
84 62 13
51 20 13
71 54 47
17 7 47
85 48 23
15 48 22
84 68 19
44 21 19
75 46 3
65 7 3
70 57 20
6 44 20
49 31 15
6 31 12
88 53 32
16 53 19
56 31 18
29 9 18
96 56 43
25 28 43
93 83 48
0 45 48
60 27 14
23 27 10
70 60 9
10 51 9
82 34 12
66 4 12
87 64 51
13 64 10
66 48 14
62 0 4
86 74 21
43 22 21
99 47 23
85 0 14
68 29 3
62 3 3
54 53 1
10 43 1
95 79 75
91 0 4
84 7 5
72 7 5
*/