ZJU 1005 Jugs
分析:简单的BFS一次,用二维矩阵来记住已搜索或正在搜索点。
Code
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int memory[1001][1001],n,fullA,fullB;
struct Jugs
{
int a,b;
vector<int> v;
}success_result;
void Display(Jugs t)
{
vector<int>::iterator begin=t.v.begin(),end=t.v.end();
for(;begin!=end;++begin)
{
switch(*begin)
{
case 1: cout<<"fill A"<<endl; break;
case 2: cout<<"fill B"<<endl; break;
case 3: cout<<"empty A"<<endl; break;
case 4: cout<<"empty B"<<endl; break;
case 5: cout<<"pour A B"<<endl; break;
case 6: cout<<"pour B A"<<endl; break;
}
}
cout<<"success"<<endl;
}
int main()
{
queue<Jugs> que;
while(cin>>fullA>>fullB>>n)
{
memset(memory,0,1001*1001*sizeof(int));
Jugs t,temp;
t.a = 0; t.b = 0;
que.push(t);
memory[0][0] = 63;
bool found = false;
while(!que.empty())
{
t = que.front();
bool result = false;
if(!(memory[fullA][t.b]&1) && t.a!=fullA)
{
memory[fullA][t.b] |= 1;
temp = t;
temp.v.push_back(1);
temp.a = fullA;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
if(!(memory[t.a][fullB]&2) && t.b!=fullB)
{
memory[t.a][fullB] |=2;
temp = t;
temp.v.push_back(2);
temp.b = fullB;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
if(!(memory[0][t.b]&4) && t.a!=0)
{
memory[0][t.b] |= 4;
temp = t;
temp.v.push_back(3);
temp.a = 0;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
if(!(memory[t.a][0]&8) && t.b!=0)
{
memory[t.a][0] |= 8;
temp = t;
temp.v.push_back(4);
temp.b = 0;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
if(t.b!=fullB && t.a!=0)
{
temp = t;
temp.v.push_back(5);
if(fullB-t.b>=t.a && !(memory[0][t.b+t.a]&16))
{
memory[0][t.b+t.a] |= 16;
temp.a = 0;
temp.b = t.b+t.a;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
else if(fullB-t.b<t.a && !(memory[t.a-fullB+t.b][fullB]&16))
{
memory[t.a-fullB+t.b][fullB] |= 16;
temp.a = t.a-fullB+t.b;
temp.b = fullB;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
}
if(t.a!=fullA && t.b!=0)
{
temp = t;
temp.v.push_back(6);
if(fullA-t.a>=t.b && !(memory[t.a+t.b][0]&32))
{
memory[t.a+t.b][0] |= 32;
temp.b = 0;
temp.a = t.a+t.b;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
else if(fullA-t.a<t.b && !(memory[fullA][t.b-fullA+t.a]&32))
{
memory[fullA][t.b-fullA+t.a] |= 32;
temp.a = fullA;
temp.b = t.b-fullA+t.a;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
}
que.pop();
}
Display(success_result);
while(!que.empty())
que.pop();
}
return 0;
}
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int memory[1001][1001],n,fullA,fullB;
struct Jugs
{
int a,b;
vector<int> v;
}success_result;
void Display(Jugs t)
{
vector<int>::iterator begin=t.v.begin(),end=t.v.end();
for(;begin!=end;++begin)
{
switch(*begin)
{
case 1: cout<<"fill A"<<endl; break;
case 2: cout<<"fill B"<<endl; break;
case 3: cout<<"empty A"<<endl; break;
case 4: cout<<"empty B"<<endl; break;
case 5: cout<<"pour A B"<<endl; break;
case 6: cout<<"pour B A"<<endl; break;
}
}
cout<<"success"<<endl;
}
int main()
{
queue<Jugs> que;
while(cin>>fullA>>fullB>>n)
{
memset(memory,0,1001*1001*sizeof(int));
Jugs t,temp;
t.a = 0; t.b = 0;
que.push(t);
memory[0][0] = 63;
bool found = false;
while(!que.empty())
{
t = que.front();
bool result = false;
if(!(memory[fullA][t.b]&1) && t.a!=fullA)
{
memory[fullA][t.b] |= 1;
temp = t;
temp.v.push_back(1);
temp.a = fullA;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
if(!(memory[t.a][fullB]&2) && t.b!=fullB)
{
memory[t.a][fullB] |=2;
temp = t;
temp.v.push_back(2);
temp.b = fullB;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
if(!(memory[0][t.b]&4) && t.a!=0)
{
memory[0][t.b] |= 4;
temp = t;
temp.v.push_back(3);
temp.a = 0;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
if(!(memory[t.a][0]&8) && t.b!=0)
{
memory[t.a][0] |= 8;
temp = t;
temp.v.push_back(4);
temp.b = 0;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
if(t.b!=fullB && t.a!=0)
{
temp = t;
temp.v.push_back(5);
if(fullB-t.b>=t.a && !(memory[0][t.b+t.a]&16))
{
memory[0][t.b+t.a] |= 16;
temp.a = 0;
temp.b = t.b+t.a;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
else if(fullB-t.b<t.a && !(memory[t.a-fullB+t.b][fullB]&16))
{
memory[t.a-fullB+t.b][fullB] |= 16;
temp.a = t.a-fullB+t.b;
temp.b = fullB;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
}
if(t.a!=fullA && t.b!=0)
{
temp = t;
temp.v.push_back(6);
if(fullA-t.a>=t.b && !(memory[t.a+t.b][0]&32))
{
memory[t.a+t.b][0] |= 32;
temp.b = 0;
temp.a = t.a+t.b;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
else if(fullA-t.a<t.b && !(memory[fullA][t.b-fullA+t.a]&32))
{
memory[fullA][t.b-fullA+t.a] |= 32;
temp.a = fullA;
temp.b = t.b-fullA+t.a;
//if(temp.a==n || temp.b==n)
if(temp.b==n)
{ success_result = temp; break; }
que.push(temp);
}
}
que.pop();
}
Display(success_result);
while(!que.empty())
que.pop();
}
return 0;
}