Pagini recente » Cod sursa (job #140454) | Cod sursa (job #2894173) | Cod sursa (job #997735) | Cod sursa (job #1916469) | Cod sursa (job #2395309)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <cstdio>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
#define NMAX 1010
int n, m;
int a[NMAX][NMAX];
int dx[] = {-1, 0, 0, 1}, dy[] = {0, -1, 1, 0};
pair<int, int> start, finish;
queue<pair<int, int>> Q;
bool test(int k)
{
if(k > a[start.first][start.second])
return 0;
bool viz[NMAX][NMAX] = {0};
Q.push(start);
viz[start.first][start.second];
while(!Q.empty())
{
pair<int, int> nod = Q.front();
if(nod.first == finish.first && nod.second == finish.second)
{
while(!Q.empty()) Q.pop();
return 1;
}
Q.pop();
for(int i = 0 ; i < 4; i++)
{
int new_x = nod.first + dx[i];
int new_y = nod.second + dy[i];
if(!viz[new_x][new_y] && a[new_x][new_y] >= k)
{
viz[new_x][new_y] = 1;
Q.push(make_pair(new_x, new_y));
}
}
}
if(viz[finish.first][finish.second])
return 1;
return 0;
}
int cauta()
{
int st = 2, dr = 2000, sol = -1 , mid;
while(st <= dr)
{
int mij = (dr + st ) / 2;
if(test(mij))
{
sol = mij;
st = mij+1;
}
else
dr = mij - 1;
}
return sol;
}
void Lee()
{
while(!Q.empty())
{
int x = Q.front().first;
int y = Q.front().second;
Q.pop();
for(int i = 0 ; i < 4; i++)
{
int new_x = x + dx[i];
int new_y = y + dy[i];
if(!a[new_x][new_y])
{
a[new_x][new_y] = a[x][y] + 1;
Q.push(make_pair(new_x, new_y));
}
else if(a[new_x][new_y] > a[x][y] + 1)
a[new_x][new_y] = a[x][y] + 1;
}
}
}
void bordare()
{
for(int i = 1; i <= n; i++)
a[i][0] = a[i][m + 1] = -1;
for(int j = 1; j <= m; j++)
a[0][j] = a[n+1][j] = -1;
}
void citire()
{
fin>>n>>m;
char s[NMAX];
fin.get();
for(int i = 1; i <= n; i++)
{
fin.getline(s, NMAX);
for(int j = 0; j < m; j++)
switch(s[j])
{
case 'I':
start = make_pair(i, j + 1);
break;
case 'D':
a[i][j + 1] = 1;
Q.push(make_pair(i, j + 1));
break;
case 'O':
finish = make_pair(i, j + 1);
break;
case '*':
a[i][j+1] = -1;
break;
}
}
}
int main()
{
citire();
bordare();
Lee();
fout<<cauta() - 1;
return 0;
}