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

来源:互联网 发布:沃仕达监控软件下载 编辑:程序博客网 时间:2024/04/28 08:40

题目链接: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
原创粉丝点击