先附上题目链接
题目和倒可乐那题差不多,不过还多了一点要记录路径.一开始我用的是par数组来存储路径.tle了之后又改用了string来存.但还是tle.最后奇幻的是把void声明改成bool再改一下返回值就不tle了…
现附上void和bool类型的code.如果有大佬知道怎么回事希望能解答一下.
TLEcode
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <string.h>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long ll;
struct node {
string x;
int a, b, cost;
};
const int mn = 1e5;
bool vis[110][110];
node p[110][110];
int cup[2], e;
void bfs() {
queue<node> q;
node sta; sta.a = 0, sta.b = 0, sta.cost = 0,sta.x="";
vis[0][0] = 1;
q.push(sta);
while (!q.empty()) {
node cur = q.front();
q.pop();
if (cur.a == e || cur.b == e) {
cout << cur.cost << endl;
if (cur.cost == 0) return;
cout << cur.x;
return;
}
node nn = cur;
if (!vis[cup[0]][cur.b]) {
vis[cup[0]][cur.b] = 1;
nn.a = cup[0];
nn.cost = cur.cost + 1;
nn.x += "FILL(1)\n";
q.push(nn);
}
nn = cur;
if (!vis[cur.a][cup[1]]) {
vis[cur.a][cup[1]] = 1;
nn.b = cup[1];
nn.cost = cur.cost + 1;
nn.x += "FILL(2)\n";
q.push(nn);
}
nn = cur;
if (!vis[0][cur.b]) {
vis[0][cur.b] = 1;
nn.a = 0;
nn.cost = cur.cost + 1;
nn.x += "DROP(1)\n";
q.push(nn);
}
nn = cur;
if (!vis[cur.a][0]) {
vis[cur.a][0] = 1;
nn.b = 0;
nn.cost = cur.cost + 1;
nn.x += "DROP(2)\n";
q.push(nn);
}
nn = cur;
if (cur.a > 0 && cur.b < cup[1]) {
int d = cup[1] - cur.b;
if (cur.a >= d) {
nn.b = cup[1];
nn.a = cur.a - d;
}
else {
nn.b = cur.a + cur.b;
nn.a = 0;
}
if (!vis[nn.a][nn.b]) {
nn.cost = cur.cost + 1;
nn.x += "POUR(1,2)\n";
vis[nn.a][nn.b] = 1;
q.push(nn);
}
}
nn = cur;
if (cur.b > 0 && cur.a < cup[0]) {
int d = cup[0] - cur.a;
if (cur.b >= d) {
nn.a = cup[0];
nn.b = cur.b - d;
}
else {
nn.a = cur.b + cur.a;
nn.b = 0;
}
if (!vis[nn.a][nn.b]) {
nn.cost = cur.cost + 1;
nn.x += "POUR(2,1)\n";
vis[nn.a][nn.b] = 1;
q.push(nn);
}
}
}
cout << "impossible\n";
return;
}
int main() {
scanf("%d%d%d", &cup[0], &cup[1], &e);
bfs();
return 0;
}
ACcode
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <stack>
#include <string.h>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long ll;
struct node {
string x;
int a, b, cost;
};
const int mn = 1e5;
bool vis[110][110];
int cup[2], e;
bool bfs() {
queue<node> q;
node sta; sta.a = 0, sta.b = 0, sta.cost = 0,sta.x="";
vis[0][0] = 1;
q.push(sta);
while (!q.empty()) {
node cur = q.front();
q.pop();
if (cur.a == e || cur.b == e) {
cout << cur.cost << endl;
if (cur.cost == 0) return true;
cout << cur.x;
return true;
}
node nn = cur;
if (!vis[cup[0]][cur.b]) {
vis[cup[0]][cur.b] = 1;
nn.a = cup[0];
nn.cost = cur.cost + 1;
nn.x += "FILL(1)\n";
q.push(nn);
}
nn = cur;
if (!vis[cur.a][cup[1]]) {
vis[cur.a][cup[1]] = 1;
nn.b = cup[1];
nn.cost = cur.cost + 1;
nn.x += "FILL(2)\n";
q.push(nn);
}
nn = cur;
if (!vis[0][cur.b]) {
vis[0][cur.b] = 1;
nn.a = 0;
nn.cost = cur.cost + 1;
nn.x += "DROP(1)\n";
q.push(nn);
}
nn = cur;
if (!vis[cur.a][0]) {
vis[cur.a][0] = 1;
nn.b = 0;
nn.cost = cur.cost + 1;
nn.x += "DROP(2)\n";
q.push(nn);
}
nn = cur;
if (cur.a > 0 && cur.b < cup[1]) {
int d = cup[1] - cur.b;
if (cur.a >= d) {
nn.b = cup[1];
nn.a = cur.a - d;
}
else {
nn.b = cur.a + cur.b;
nn.a = 0;
}
if (!vis[nn.a][nn.b]) {
nn.cost = cur.cost + 1;
nn.x += "POUR(1,2)\n";
vis[nn.a][nn.b] = 1;
q.push(nn);
}
}
nn = cur;
if (cur.b > 0 && cur.a < cup[0]) {
int d = cup[0] - cur.a;
if (cur.b >= d) {
nn.a = cup[0];
nn.b = cur.b - d;
}
else {
nn.a = cur.b + cur.a;
nn.b = 0;
}
if (!vis[nn.a][nn.b]) {
nn.cost = cur.cost + 1;
nn.x += "POUR(2,1)\n";
vis[nn.a][nn.b] = 1;
q.push(nn);
}
}
}
return false;
}
int main() {
scanf("%d%d%d", &cup[0], &cup[1], &e);
if(!bfs()) cout << "impossible\n";
return 0;
}