Cod sursa(job #972840)

Utilizator smaraldaSmaranda Dinu smaralda Data 12 iulie 2013 18:57:46
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

int n,m,d[1010][1010],di[]={-1,0,1,0},dj[]={0,1,0,-1};
int vis[1010][1010];
char grid[1010][1010];
pair <int, int> start, finish;
queue < pair <int, int> > q;

void bordeaza ()
{
    int i,j;
    for(i=0;i<=n+1;i++)
        grid[i][0]=grid[i][m+1]='*';
    for(j=0;j<=m+1;j++)
        grid[0][j]=grid[n+1][j]='*';
}

void bfs()
{
    int xn,yn,x,y,k;
    while(!q.empty())
        {
            x=q.front().first;
            y=q.front().second;

            for(k=0;k<4;k++)
                {
                    xn=x+di[k];
                    yn=y+dj[k];
                    if(grid[xn][yn]!='*' && (d[xn][yn] > d[x][y]+1 || !vis[xn][yn]))
                        {
                            d[xn][yn]=d[x][y]+1;
                            vis[xn][yn]=1;
                            q.push(make_pair(xn,yn));
                        }
                }
            q.pop();
        }
}

bool check (int min)
{
    while(!q.empty())
        q.pop();
    memset(vis,0,sizeof(vis));

    int k,x,y,xn,yn;
    q.push(start);
    while(!q.empty())
        {
            x=q.front().first;
            y=q.front().second;
            vis[x][y]=1;
            for(k=0;k<4;k++)
                {
                    xn=x+di[k];
                    yn=y+dj[k];
                    if(grid[xn][yn]!='*' && !vis[xn][yn] && d[xn][yn]>=min)
                        {
                            if(make_pair(xn,yn)==finish)
                                return 1;
                            q.push(make_pair(xn,yn));
                            vis[xn][yn]=vis[x][y]+1;
                        }
                }
            q.pop();
        }
    return 0;
}

int bs (int right)
{
    int left=1,mid,sol=-1;
    while(left<=right)
        {
            mid=(left+right)>>1;
            if(check(mid))
                {
                    sol=mid;
                    left=mid+1;
                }
            else
                right=mid-1;
        }
    return sol;
}

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    int i,j;
    char ch;
    scanf("%d%d\n",&n,&m);
    for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
                {
                    scanf("%c",&grid[i][j]);
                    if(grid[i][j]=='D')
                        q.push(make_pair(i,j));
                    if(grid[i][j]=='I')
                        start=make_pair(i,j);
                    if(grid[i][j]=='O')
                        finish=make_pair(i,j);
                }
            scanf("\n");
        }

    bordeaza();
    bfs();

    printf("%d\n",bs(n*m));
    return 0;
}