思路:abc三個水杯 一共有六種倒水方式。a-b,a-c ; b-a,b-c;c-d;廣搜著6種方式即可。但是得判斷杯子裡的水放進另外乙個杯子放不放的下,另外乙個杯子需要多少水,杯子子裡有沒有水可放。不要忘記目標和初始狀態一樣那種情況。
時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:4 描述
給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。
輸入第一行乙個整數n(0v2>v3 v1<100 v3>0)表示三個水杯的體積。
第二行給出三個整數e1 e2 e3 (體積小於等於相應水杯體積)表示我們需要的最終狀態
輸出每行輸出相應測試資料最少的倒水次數。如果達不到目標狀態輸出-1
樣例輸入
26 3 1
4 1 1
9 3 2
7 1 1
樣例輸出
3-1
**:
#include#include #include #include #define queuelen 1000000
int d,b,c, flag;//abc表示三個杯子的容積
int vis[101][101][101];
typedef struct
data;//xyz表示三個杯子現在有多少水。
data data[queuelen];
typedef struct
sqtype;
//佇列的初始化
sqtype *sqtypeinit()
else }
//判斷空佇列
int sqtypeisempty(sqtype *q)
//入隊
int insqtype(sqtype *q,data a)
else }
//出佇列
int outsqtype(sqtype *q,data &a)
else
}bool bfs(int x,int y,int z,int zx,int zy,int zz)
sqtype *shuibei=sqtypeinit();
data a=;
insqtype(shuibei,a);
vis[x][y][z]=1;
while(!sqtypeisempty(shuibei))
if(vis[nx][ny][nz]==0)
}if(a.x!=0&&a.z0?a.x-(c-a.z):0;//同上面的原理一樣
int ny=a.y;
int nz=a.x-(c-a.z)>0?a.z+(c-a.z):a.z+a.x;
if(nx==zx&&ny==zy&&nz==zz)
if(vis[nx][ny][nz]==0)
}if(a.y!=0)//b杯子有水
if(vis[nx][ny][nz]==0)
}if(a.y!=0&&a.z0?a.y-(c-a.z):0;
int nz=a.y-(c-a.z)>0?a.z+(c-a.z):a.z+a.y;
if(nx==zx&&ny==zy&&nz==zz)
if(vis[nx][ny][nz]==0 )
}if(a.z!=0)
if(vis[nx][ny][nz]==0)
}if(a.z!=0&&a.ya.z?a.y+a.z:b;判斷b杯子能否裝下c杯子裡的水能裝下則等於a.y+a.z c杯子此時沒水。裝不下則可以裝滿就直接等於b c此時等於c杯子的水減去b杯子需要多少水。
int nz=b-a.y>a.z?0:a.z-(b-a.y);
if(nx==zx&&ny==zy&&nz==zz)
if(vis[nx][ny][nz]==0)
}
} }int main()
}
A 三個水杯 BFS
題目描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入第一行乙個整數n 0v2 v3 v1 100 v3 0 表示三個水杯的體積。...
nyoj 三個水杯 BFS
解題思路 有三種容量的杯子 v1,v2,v3 記錄每乙個杯子裡水的體積為 s1,s2,s3 每乙個杯子的剩餘容量為水杯裡的水在相互傾倒的時候會有以下的兩種情況 1 乙個杯子a所剩的容量 大小為va sa 比水杯b要倒過來的水 大小為sb 大的時候可以將b裡的水全部倒到a中,最終a中水的體積為sa s...
nyoj三個水杯 bfs
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入第一行乙個整數...