題目描述:
http://poj.org/problem?id=3414
中文大意:
使用兩個鍋,盛取定量水。
兩個鍋的容量和目標水量由使用者輸入。
允許的操作有:灌滿鍋、倒光鍋內的水、一個鍋中的水倒入另一個鍋。
在兩個鍋互相倒水的過程中,若一個鍋被倒滿,而原來的鍋中還有水,則剩餘在原來的鍋中。
不斷執行這三個過程,直到任意一個鍋中,貯存了目標數量的水,過程結束。
思路:
佇列節點記錄的是當前兩個鍋的貯水量和之前的一系列操作。
在彈出佇列首節點,獲取了當前兩個鍋的水量資訊後,後續怎麼操作,有 6 種選擇:FILL(1)、FILL(2)、DROP(1)、DROP(2)、POUR(1,2)、POUR(2,1)。
其中,宣告瞭一個陣列 visited[105][105],用來記錄當前的情況是否出現過,若沒有出現過,再將其壓入佇列,否則會超時。
程式碼:
#include<iostream>
#include<queue>
#include<string>
using namespace std;
int a,b,c;
struct node{
int x,y;
vector<string> msg;
node(int x, int y, vector<string> msg){
this->x = x;
this->y = y;
this->msg = msg;
};
node(int x, int y){
this->x = x;
this->y = y;
};
};
bool visited[105][105] = {false};
void bfs(){
node start = node(0, 0);
node next = node(0, 0);
visited[0][0] = true;
queue<node> q;
q.push(start);
while(!q.empty()){
start = q.front();
q.pop();
if(start.x == c || start.y == c){
int n = start.msg.size();
printf("%d\n", n);
for(int i=0;i<n;i++){
cout<<start.msg[i]<<endl;
}
return;
}
//FILL(1)
next = node(a, start.y, start.msg);
if(!visited[next.x][next.y]){
visited[next.x][next.y] = true;
next.msg.push_back("FILL(1)");
q.push(next);
}
//FILL(2)
next = node(start.x, b, start.msg);
if(!visited[next.x][next.y]){
visited[next.x][next.y] = true;
next.msg.push_back("FILL(2)");
q.push(next);
}
//DROP(1)
next = node(0, start.y, start.msg);
if(!visited[next.x][next.y]){
visited[next.x][next.y] = true;
next.msg.push_back("DROP(1)");
q.push(next);
}
//DROP(2)
next = node(start.x, 0, start.msg);
if(!visited[next.x][next.y]){
visited[next.x][next.y] = true;
next.msg.push_back("DROP(2)");
q.push(next);
}
//POUR(1,2)
int fill_num = b - start.y;
if(start.x >= fill_num){
next = node(start.x - fill_num, b, start.msg);
if(!visited[next.x][next.y]){
visited[next.x][next.y] = true;
next.msg.push_back("POUR(1,2)");
q.push(next);
}
}
else{
next = node(0, start.y + start.x, start.msg);
if(!visited[next.x][next.y]){
visited[next.x][next.y] = true;
next.msg.push_back("POUR(1,2)");
q.push(next);
}
}
//POUR(2,1)
fill_num = a - start.x;
if(start.y >= fill_num){
next = node(a, start.y - fill_num, start.msg);
if(!visited[next.x][next.y]){
visited[next.x][next.y] = true;
next.msg.push_back("POUR(2,1)");
q.push(next);
}
}
else{
next = node(start.x + start.y, 0, start.msg);
if(!visited[next.x][next.y]){
visited[next.x][next.y] = true;
next.msg.push_back("POUR(2,1)");
q.push(next);
}
}
}
printf("impossible\n");
}
int main(){
scanf("%d %d %d", &a, &b, &c);
bfs();
}