Cod sursa(job #1053427)

Utilizator mihai_tMihai Teletin mihai_t Data 12 decembrie 2013 19:10:30
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <fstream>
#include <string>
#include <queue>
#include <iostream>
using namespace std;

int a[101][101],n,m,rm[101][101],jl[101][101];
struct pct
{
    int x,y;
};
pct rom,jul;
queue <pct> c;
const int dx[]={1,1,0,-1,-1,-1,0,1};
const int dy[]={0,-1,-1,-1,0,1,1,1};

void cit()
{
    ifstream f;
    string ln;
    f.open("rj.in");
    f>>n>>m;
    getline(f,ln);
    for (int i=1;i<=n;++i)
    {
        getline(f,ln);
        for (int j=0;j<m;++j)
            if (ln[j]=='X') a[i][j+1]=1;
            else if (ln[j]==' ') a[i][j+1]=0;
            else if(ln[j]=='R')
            {
                rom.x=i;
                rom.y=j+1;
            }
            else if(ln[j]=='J')
            {
                jul.x=i;
                jul.y=j+1;
            }
    }
}
void lee(int b[101][101],int x,int y)
{
    pct p,p2;
    p.x=x;
    p.y=y;
    c.push(p);
    while (!c.empty())
    {
        p=c.front();
        c.pop();
        for (int i=0;i<8;i++)
        {
            if (p.x+dx[i]>0 && p.x+dx[i]<=m && p.y+dy[i]>0 && p.y+dy[i]<=n)
                if (a[p.x+dx[i]][p.y+dy[i]]==0 && (p.x+dx[i]!=x ||  p.y+dy[i]!=y))
                {
                    if (b[p.x+dx[i]][p.y+dy[i]]==0 || b[p.x+dx[i]][p.y+dy[i]]>1+b[p.x][p.y])
                    {
                        b[p.x+dx[i]][p.y+dy[i]]=1+b[p.x][p.y];
                        p2.x=p.x+dx[i];
                        p2.y=p.y+dy[i];
                        c.push(p2);
                    }
                }
        }
    }
}
void rez()
{
    pct p;
    int min=10000;
    for (int i=1;i<=n;++i)
        for (int j=m;j>=1;--j)
        {
            if (rm[i][j]!=0 && rm[i][j]==jl[i][j]) if (rm[i][j]<min)
            {
                min=rm[i][j];
                p.x=i;
                p.y=j;
            }
        }
    ofstream g;
    g.open("rj.out");
    g<<min+1<<" "<<p.x<<" "<<p.y;
    g.close();
}
void afis(int a[101][101])
{
    for (int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
            cout<<a[i][j];
            cout<<'\n';
    }
}
int main()
{
    cit();
    lee(rm,rom.x,rom.y);
    lee(jl,jul.x,jul.y);
    rez();
    return 0;
}