Pagini recente » Cod sursa (job #3229789) | Cod sursa (job #2737205) | Cod sursa (job #3187896) | Cod sursa (job #3292211) | Cod sursa (job #3299116)
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
int n,m;
char ch[1005][1005];
int viz[1005][1005];
int Lee[1005][1005];
int dx[4],dy[4];
priority_queue <pair <int,pair <int,int>>> h; // value ; indexI indexJ
void MakeDs(){
dx[1] = 0;
dx[3] = 0;
dx[0] = -1;
dx[2] = 1;
dy[0] = 0;
dy[2] = 0;
dy[1] = 1;
dy[3] = -1;
return;
}
bool IsInMatrix(int i,int j){
if (i<1 or n<i) return 0;
if (j<1 or m<j) return 0;
return 1;
}
bool IsWalkable(int i,int j){
if (ch[i][j]=='I' or ch[i][j]=='O' or ch[i][j]=='.') return 1;
return 0;
}
void Lee_Function(int i1,int j1){
for (int i=1;i<=n;++i){
for (int j=1;j<=m;++j){
viz[i][j] = 0;
}
}
queue <pair <int,int>> q;
q.push({i1,j1});
viz[i1][j1] = 1;
Lee[i1][j1] = 0;
while (!q.empty()){
int x = q.front().first, y = q.front().second;
q.pop();
for (int k=0;k<=3;++k){
int nx = x+dx[k], ny = y+dy[k];
if (IsInMatrix(nx,ny)==1 and IsWalkable(nx,ny)==1 and viz[nx][ny]==0){
Lee[nx][ny] = min(Lee[x][y]+1,Lee[nx][ny]);
viz[nx][ny] = 1;
q.push({nx,ny});
}
}
}
return;
}
signed main()
{
ios_base::sync_with_stdio(false);
fin.tie(NULL);
fout.tie(NULL);
MakeDs();
fin >> n >> m;
int ist,jst;
int ifn,jfn;
for (int i=1;i<=n;++i){
for (int j=1;j<=m;++j){
fin >> ch[i][j];
Lee[i][j] = 1e9;
if (ch[i][j]=='I'){
ist = i;
jst = j;
}
if (ch[i][j]=='O'){
ifn = i;
jfn = j;
}
}
}
for (int i=1;i<=n;++i){
for (int j=1;j<=m;++j){
if (ch[i][j]=='D'){
Lee_Function(i,j);
}
}
}
/*
for (int i=1;i<=n;++i){
for (int j=1;j<=m;++j){
int loc = Lee[i][j];
if (loc==1e9) loc = -1;
if (loc<10 and loc>-1) cout << '0';
cout << loc << ' ';
}
cout << '\n';
}
*/
for (int i=1;i<=n;++i){
for (int j=1;j<=m;++j){
viz[i][j] = 0;
}
}
h.push({Lee[ist][jst],{ist,jst}});
viz[ist][jst] = 1;
int ans = Lee[ist][jst];
while (!h.empty() and !viz[ifn][jfn]){
int x = h.top().se.fi, y = h.top().se.se;
if (ans>Lee[x][y]){
ans = Lee[x][y];
}
viz[x][y] = 1;
h.pop();
for (int k=0;k<=3;++k){
int nx = x+dx[k], ny = y+dy[k];
if (IsInMatrix(nx,ny) and IsWalkable(nx,ny)==1 and viz[nx][ny]==0){
h.push({Lee[nx][ny],{nx,ny}});
}
}
}
if (viz[ifn][jfn]==0) ans = -1;
fout << ans;
return 0;
}