Pagini recente » Cod sursa (job #1892324) | Cod sursa (job #297836) | Cod sursa (job #2010275) | Cod sursa (job #1314141) | Cod sursa (job #2191374)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define MAXN 1005
#define MAX 1000000
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int n,m,dp[MAXN][MAXN],dragon[MAXN][MAXN],x1,y1,x2,y2;
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
bool v[MAXN][MAXN];
queue<pair<int,int> >stiva;
vector<pair<int,int> >dragoni;
void afis(auto v[MAXN][MAXN]){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++)
cerr<<v[i][j]<<" ";
cerr<<endl;
}
}
bool in_matrice(int x,int y){
if(x >= 1 && x <= n && y >= 1 && y <= m && v[x][y])
return true;
return false;
}
void lee_dragon(){
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
dragon[i][j] = MAX;
for(auto i : dragoni){
int x = i.first, y = i.second;
stiva.push({x,y});
dragon[x][y] = 0;
}
int xnou,ynou;
while(!stiva.empty()){
int x = stiva.front().first;
int y = stiva.front().second;
stiva.pop();
for(int i = 0; i < 4; i++){
xnou = x + dx[i];
ynou = y + dy[i];
if(in_matrice(xnou,ynou) && dragon[x][y] + 1 < dragon[xnou][ynou]){
dragon[xnou][ynou] = dragon[x][y] + 1;
stiva.push({xnou,ynou});
}
}
}
}
bool lee_drum(int x1,int y1,int x2,int y2,int minim){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++)
dp[i][j] = MAX;
}
stiva.push({x1,y1});
dp[x1][y1] = dragon[x1][y1];
int xnou,ynou;
while(!stiva.empty()){
int x = stiva.front().first;
int y = stiva.front().second;
stiva.pop();
for(int i = 0; i < 4; i++){
xnou = x + dx[i];
ynou = y + dy[i];
if(in_matrice(xnou,ynou) && dragon[xnou][ynou] >= minim &&
dp[x][y] + dragon[xnou][ynou] < dp[xnou][ynou]){
dp[xnou][ynou] = dp[x][y] + dragon[x][y];
stiva.push({xnou,ynou});
}
}
}
if(dp[x2][y2] >= minim && dp[x2][y2] != MAX)
return true;
return false;
}
int cautbin(){
int pas = 1<<12, r = 0;
while(pas){
if(lee_drum(x1,y1,x2,y2,r+pas))
r += pas;
pas /= 2;
}
if(!r)
r = -1;
return r;
}
int main()
{
in>>n>>m;
char ch;
for(int i = 1; i <= n ; i++){
for(int j = 1; j <= m; j++){
in>>ch;
if(ch == 'I'){
x1 = i,y1 = j;
v[i][j] = true;
}else if(ch == 'O'){
x2 = i,y2 = j;
v[i][j] = true;
}else if(ch == 'D'){
dragoni.push_back(make_pair(i,j));
v[i][j] = false;
}else if(ch == '*')
v[i][j] = false;
else
v[i][j] = true;
}
}
lee_dragon();
out<<cautbin();
return 0;
}