nyoj21(三个水杯)(一般的广搜)

题目链接:click here~

裸的广搜,总共有6个状态,V1-->V2,V1-->V3,V2-->V1,V2-->V3,V3-->V1,V3-->V2.

代码如下:

001. #include<stdio.h>
002. #include<string.h>
003. #include<queue>
004. #include<algorithm>
005. using namespace std;
006.  
007. int V1,V2,V3,E1,E2,E3;
008.  
009. struct state
010. {
011. int a,b,c,step;
012. }s1,s3;
013. int visited[102][102][102];
014. void bfs()
015. {
016. memset(visited,0,sizeof(visited));
017. queue<state>q;
018. visited[s1.a][s1.b][s1.c]=1;
019. q.push(s1);
020. while(!q.empty())
021. {
022. state s2=q.front();
023. q.pop();
024. if(s2.a==E1&&s2.b==E2&&s2.c==E3)
025. {
026. printf("%d\n",s2.step);
027. return ;
028. }
029. if(s2.a>0&&s2.b<V2)             //v1-->v2(因为水杯没有刻度,所以每次倒的时候要么全倒完,
030. //要么倒另一个杯子余下的全部容量)
031. {
032. int t=min(s2.a,V2-s2.b);
033. s3.a=s2.a-t;
034. s3.b=s2.b+t;
035. s3.c=s2.c;
036. if(!visited[s3.a][s3.b][s3.c])
037. {
038. visited[s3.a][s3.b][s3.c]=1;
039. s3.step=s2.step+1;
040. q.push(s3);
041. }
042. }
043. if(s2.a>0&&s2.c<V3)                     //v1-->v3
044. {
045. int t=min(s2.a,V3-s2.c);
046. s3.a=s2.a-t;
047. s3.c=s2.c+t;
048. s3.b=s2.b;
049. if(!visited[s3.a][s3.b][s3.c])
050. {
051. visited[s3.a][s3.b][s3.c]=1;
052. s3.step=s2.step+1;
053. q.push(s3);
054. }
055. }
056. if(s2.b>0&&s2.a<V1)                          //v2-->v1
057. {
058. int t=min(s2.b,V1-s2.a);
059. s3.b=s2.b-t;
060. s3.a=s2.a+t;
061. s3.c=s2.c;
062. if(!visited[s3.a][s3.b][s3.c])
063. {
064. visited[s3.a][s3.b][s3.c]=1;
065. s3.step=s2.step+1;
066. q.push(s3);
067. }
068. }
069. if(s2.b>0&&s2.c<V3)                            //v2-->v3
070. {
071. int t=min(s2.b,V3-s2.c);
072. s3.b=s2.b-t;
073. s3.c=s2.c+t;
074. s3.a=s2.a;
075. if(!visited[s3.a][s3.b][s3.c])
076. {
077. visited[s3.a][s3.b][s3.c]=1;
078. s3.step=s2.step+1;
079. q.push(s3);
080. }
081. }
082. if(s2.c>0&&s2.a<V1)                         //v3-->v1
083. {
084. int t=min(s2.c,V1-s2.a);
085. s3.c=s2.c-t;
086. s3.a=s2.a+t;
087. s3.b=s2.b;
088. if(!visited[s3.a][s3.b][s3.c])
089. {
090. visited[s3.a][s3.b][s3.c]=1;
091. s3.step=s2.step+1;
092. q.push(s3);
093. }
094. }
095. if(s2.c>0&&s2.b<V2)                        //v3-->v2
096. {
097. int t=min(s2.c,V2-s2.b);
098. s3.c=s2.c-t;
099. s3.b=s2.b+t;
100. s3.a=s2.a;
101. if(!visited[s3.a][s3.b][s3.c])
102. {
103. visited[s3.a][s3.b][s3.c]=1;
104. s3.step=s2.step+1;
105. q.push(s3);
106. }
107. }
108. }
109. printf("-1\n");
110. }
111. int main()
112. {
113. int N;
114. scanf("%d",&N);
115. while(N--)
116. {
117. scanf("%d%d%d%d%d%d",&V1,&V2,&V3,&E1,&E2,&E3);
118. if(V1<E1+E2+E3)
119. printf("-1\n");
120. else
121. {
122. s1.a=V1;
123. s1.b=0;
124. s1.c=0;
125. s1.step=0;
126. bfs();
127. }
128. }
129. return 0;
130. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值