| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
使用状态记录上一步位置一般bfs的时候需要记录一个状态是否已经到达过,所以可以正好利用这个记录来标记上一步的状态。
还有就是因为a和b都小于101,所以可以用一个整数来标记一个状态。
不过最烦躁的是六种不同的操作,实在是写的太恶心了。
#include <stdio.h>
#include <queue>
#include <vector>
using namespace std;
const int MAX = 100;
#define ASSERT(x) {if(!(x)) { int a = 0; while(1) a /= a; } }
inline int pos(int a, int b, int max_a) { return a + b * (max_a + 1); }
inline void status(int& a, int& b, int max_a, int c)
{
a = c % (max_a + 1);
b = c / (max_a + 1);
}
void print(const vector<int>& v, const int max_a)
{
printf("%d\n", v.size() - 1);
for(int i = v.size() - 1; i > 0; i--)
{
int ca, cb, la, lb;
status(ca, cb, max_a, v[i - 1]);
status(la, lb, max_a, v[i]);
if(la == 0 && cb == lb) printf("FILL(1)\n");
else if(lb == 0 && ca == la) printf("FILL(2)\n");
else if(ca == 0 && cb == lb) printf("DROP(1)\n");
else if(cb == 0 && ca == la) printf("DROP(2)\n");
else if(ca < la && cb > lb) printf("POUR(1,2)\n");
else if(ca > la && cb < lb) printf("POUR(2,1)\n");
else ASSERT(false);
}
}
bool run()
{
const int undef = -1;
int max_a, max_b, exp;
if(scanf("%d%d%d", &max_a, &max_b, &exp) == EOF) return false;
int last_step[MAX * MAX + 1];
for(int i = 0; i <= max_a; i++) for(int j = 0; j <= max_b; j++) last_step[pos(i, j, max_a)] = undef;
queue<int> q;
q.push(0);
while(!q.empty())
{
int c = q.front();
q.pop();
int a, b;
status(a, b, max_a, c);
int na, nb;
for(int i = 0; i < 6; i++)
{
if(i == 0)
{
na = max_a;
nb = b;
}
else if(i == 1)
{
na = a;
nb = max_b;
}
else if(i == 2)
{
na = 0;
nb = b;
}
else if(i == 3)
{
na = a;
nb = 0;
}
else if(i == 4)
{
na = a + b;
nb = 0;
if(na > max_a)
{
nb = na - max_a;
na = max_a;
}
}
else if(i == 5)
{
nb = a + b;
na = 0;
if(nb > max_b)
{
na = nb - max_b;
nb = max_b;
}
}
int p = pos(na, nb, max_a);
if(na == exp || nb == exp)
{
ASSERT(last_step[p] == undef);
last_step[p] = c;
vector<int> v;
while(p != undef)
{
#ifndef ONLINE_JUDGE
int a, b;
status(a, b, max_a, p);
printf("%d => %d %d\n", p, a, b);
#endif
v.push_back(p);
p = last_step[p];
}
print(v, max_a);
return true;
}
else if((na > 0 || nb > 0) && last_step[p] == undef)
{
last_step[p] = c;
q.push(p);
}
}
}
printf("impossible\n");
return true;
}
int main() { while(run()); }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator