某岛

… : "…アッカリ~ン . .. . " .. .
September 2, 2010

F. Maze Stretching

Analyse :

我之前想的复杂了些,比如说如果某一轮在搜索的时候如果沿着一个方向移动次数已经达到了最小值,那么继续将这个方向的权值增加大的话,这个值可以直接乘出来,但是最后的代码只是简单的二分答案加BFS。

另一个需要留意的是精度控制。。。我应该是没有写错的吧。

/*
    Author : xiaodao
    Series : SERPC 2009 
    Prob.  : F. Maze Stretching	
*/
#include 
#include 
#include 
#include 
#include 

using namespace std;
const int dx[4] = {0, 0, 1, -1};
const int dy[4] = {1, -1, 0, 0};
const double INF = 1e10, e = 0.0000001;
const int N = 100;

struct po{
    int x, y;
    friend bool operator ==(po a, po b){
        return a.x==b.x && a.y==b.y;
    }
};
struct re{
    po p; double k;
    friend bool operator <(re a, re b){
        return a.k>b.k;
    }
};

char maze[N+3][N+3]; bool hash[N+3][N+3];
double L, ans; po st, ed; re u, v;
int n, m;




double bfs(double w){
    memset(hash, false, sizeof(hash));
    priority_queue Q;
    u.p = st; u.k = 0; Q.push(u);

    while (!Q.empty()){
        u = Q.top(); Q.pop(); if (hash[u.p.x][u.p.y]) continue;
        if (u.p == ed) return u.k;

        hash[u.p.x][u.p.y] = true;
        for (int i=0;i<2;i++){
            v.p.x = u.p.x + dx[i]; v.p.y = u.p.y + dy[i];
            if (hash[v.p.x][v.p.y] || maze[v.p.x][v.p.y]=='#') continue;
            v.k = u.k + 1;
            Q.push(v);
        }
        for (int i=2;i<4;i++){
            v.p.x = u.p.x + dx[i]; v.p.y = u.p.y + dy[i];
            if (hash[v.p.x][v.p.y] || maze[v.p.x][v.p.y]=='#') continue;
            v.k = u.k + w;
            Q.push(v);
        }
    }
    return INF;
}

void solve(){
    double l = 0, r = 10, m;
    while (r-l>e){
        m = (l + r)/2;
        if (bfs(m)<=L) l = m;
        else r = m;
    }
    ans = l;
}

void init(){
    scanf("%lf%d", &L, &n);
    string s; cin.get(); getline(cin, s); m = s.size();
    memset(maze, '#', sizeof(maze));
    for (int j=0;j