记录编号 49579 评测结果 AAAAAAAAAA
题目名称 造房子的学问 最终得分 100
用户昵称 Gravatar王者自由 是否通过 通过
代码语言 C++ 运行时间 0.054 s
提交时间 2012-11-08 15:25:26 内存使用 0.31 MiB
显示代码纯文本
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 32767 * 10;
int n, m, r, l[3], s;
int BFS() {
    queue<pair<int, int> > q;
    bool v[N] = {0};
    q.push(make_pair(n, 0));
    while(!q.empty()) {
        vector<int> o;
        int u = q.front().first, d = q.front().second; q.pop();
        if(u < 1 || v[u]) continue;
        //fprintf(stderr, "%d(%d) ", u, d);
        v[u] = 1;
        if(u == m) return d;
        if(u > r)
            o.push_back(r), o.push_back(u - r);
        if(u > 1)
            o.push_back(u / 2);
        for(int i=0; i<3; i++)
            o.push_back(u + l[i]);
        unique(o.begin(), o.end());
        for(int i=0; i<o.size(); i++)
            q.push(make_pair(o[i], d + 1));
    } return -1;
}
int main() {
    freopen("wood.in", "r", stdin);
    freopen("wood.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(int i=0; i<3; i++)
        scanf("%d", l+i);
    scanf("%d", &r);
    if((s = BFS()) >= 0)
        printf("%d\n", s);
    else printf("No solution.\n");
    return 0;
}