Pagini recente » Cod sursa (job #788145) | Cod sursa (job #840950) | Cod sursa (job #1172085) | Cod sursa (job #361452) | Cod sursa (job #1702196)
///I give up
#include <bits/stdc++.h>
using namespace std;
const int LMAX = 1005;
const int SM = 1<<12;
struct APOZ {
int x, y;
};
struct BPOZ {
int x, y, val;
};
int r, c, d, sx, sy;
char mx[LMAX][LMAX];
int dst[LMAX][LMAX],
aux[LMAX][LMAX];
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
void init(void) {
int x, y, nx, ny, val;
queue<BPOZ> q;
for(int i=0; i<=r+1; ++i) {
mx[i][0]='*';
mx[i][c+1]='*';
}
for(int j=0; j<=c+1; ++j) {
mx[0][j]='*';
mx[r+1][j]='*';
}
for(int i=1; i<=r; ++i) {
for(int j=1; j<=c; ++j) {
if(mx[i][j]=='D') {
q.push({i, j, 1});
dst[i][j] = 1;
}
if(mx[i][j]=='I') {
sx = i;
sy = j;
}
}
}
while(!q.empty()) {
x = q.front().x;
y = q.front().y;
val = q.front().val;
q.pop();
for(int i=0; i<4; ++i) {
nx = x + dx[i];
ny = y + dy[i];
if(dst[nx][ny] || mx[nx][ny]=='*')
continue;
dst[nx][ny] = val+1;
q.push({nx, ny, val+1});
}
}
}
bool check(int x, int y) {
if(mx[x][y]=='O') return true;
bool ans = false;
aux[x][y]=d;
for(int i=0; i<4; ++i)
if(aux[x+dx[i]][y+dy[i]]!=d && dst[x+dx[i]][y+dy[i]]>d && mx[x+dx[i]][y+dy[i]]!='*')
ans = ans || check(x+dx[i], y+dy[i]);
return ans;
}
int main(void) {
FILE *fi = fopen("barbar.in", "r");
FILE *fo = fopen("barbar.out", "w");
int ans;
ans = 0;
fscanf(fi,"%d%d ",&r,&c);
for(int i=1; i<=r; ++i)
fgets(mx[i]+1, 1001, fi);
init();
for(int m=SM; m; m>>=1) {
d=ans|m;
if(check(sx, sy))
ans|=m;
}
d=-1;
if(!check(sx, sy))
fprintf(fo,"-1\n");
else
fprintf(fo,"%d\n",ans);
fclose(fi);
fclose(fo);
return 0;
}