USACO 2.4 Overfencing

USACO 2.4 Overfencing

/*
ID: lvxiaol3
LANG: C++
TASK: maze1
*/
#include<iostream>
#include<fstream>
#include<string.h>

using namespace std;


#define MAXWID 38
#define MAXHT 100

typedef struct Point Point;
struct Point
{
    int r, c;
};

int wid, ht;
char maze[MAXHT*2+1][MAXWID*2+1+2];
int dist[MAXHT*2+1][MAXWID*2+1];

Point
Pt(int r, int c)
{
    Point p;

    p.r = r;
    p.c = c;
    return p;
}

typedef struct Queue Queue;
struct Queue
{
    Point p;
    int d;
};

Queue floodq[MAXHT*MAXWID];
int bq, eq;

/* if no wall between point p and point np, add np to queue with distance d+1 */
void
addqueue(int d, Point p, Point np)
{
    if(maze[(p.r+np.r)/2][(p.c+np.c)/2] == ' ' && maze[np.r][np.c] == ' ')
    {
        maze[np.r][np.c] = '*';
        floodq[eq].p = np;
        floodq[eq].d = d+1;
        eq++;
    }
}

/* if there is an exit at point exitp, plug it and record a start point
* at startp */

void lookexit(Point exitp, Point startp)
{
    if(maze[exitp.r][exitp.c] == ' ')
    {
        addqueue(0, startp, startp);
        maze[exitp.r][exitp.c] = '#';
    }
}

int main()
{
    FILE *fin, *fout;
    Point p;
    int i, r, c, m, d;

    fin = fopen("maze1.in", "r");
    fout = fopen("maze1.out", "w");
    //assert(fin != NULL && fout != NULL);

    fscanf(fin, "%d %d\n", &wid, &ht);
    wid = 2*wid+1;
    ht = 2*ht+1;

    for(i=0; i<ht; i++)
        fgets(maze[i], sizeof(maze[i]), fin);

    /* find exits */
    for(i=1; i<wid; i+=2)
    {
        lookexit(Pt(0, i), Pt(1, i));
        lookexit(Pt(ht-1, i), Pt(ht-2, i));
    }
    for(i=1; i<ht; i+=2)
    {
        lookexit(Pt(i, 0), Pt(i, 1));
        lookexit(Pt(i, wid-1), Pt(i, wid-2));
    }

    /* must have found at least one square with an exit */
    /* since two exits might open onto the same square, perhaps eq == 1 */

    for(bq = 0; bq < eq; bq++)
    {
        p = floodq[bq].p;
        d = floodq[bq].d;
        dist[p.r][p.c] = d;

        addqueue(d, p, Pt(p.r-2, p.c));
        addqueue(d, p, Pt(p.r+2, p.c));
        addqueue(d, p, Pt(p.r, p.c-2));
        addqueue(d, p, Pt(p.r, p.c+2));
    }

    /* find maximum distance */
    m = 0;
    for(r=0; r<ht; r++)
        for(c=0; c<wid; c++)
            if(dist[r][c] > m)
                m = dist[r][c];

    fprintf(fout, "%d\n", m);
    return 0;
}

 

很基础的一个BFS或者是Floodfill问题,直接上标程吧。。。写得太挫了。。

你可能感兴趣的:(USACO 2.4 Overfencing)