1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 #include <iostream>
5 #include <vector>
6 #include <queue>
7 #include <cmath>
8 #include <set>
9 using namespace std;
10
11 #define N 25
12 #define inf 999999999
13
14 int n, m;
15 char map[N][N];
16 int c[N][N];
17
18 struct node{
19 int x, y, d;
20 node(){}
21 node(int a,int b,int c){
22 x=a;y=b;d=c;
23 }
24 }a[N*4];
25
26 struct dd{
27 int id, dis;
28 dd(){
29
30 }
31 dd(int a,int b){
32 id=a;dis=b;
33 }
34 }b[N*4][400];
35
36 bool cmp(dd a,dd b){
37 return a.dis<b.dis;
38 }
39
40 int xx[]={1,-1,0,0};
41 int yy[]={0,0,1,-1};
42 bool visited[N][N];
43 bool V[N][N];
44
45 void bfs(int id){
46 queue<node>Q;
47 Q.push(a[id]);
48 memset(visited,false,sizeof(visited));
49 visited[a[id].x][a[id].y]=true;
50 node p, q;
51 int i;
52 int cnt=0;
53 while(!Q.empty()){
54 p=Q.front();Q.pop();
55 for(i=0;i<4;i++){
56 q.x=p.x+xx[i];
57 q.y=p.y+yy[i];
58 if(q.x>=0&&q.x<n&&q.y>=0&&q.y<m&&map[q.x][q.y]==‘.‘&&!visited[q.x][q.y]){
59 q.d=p.d+1;
60 Q.push(q);
61 b[id][cnt++]=dd(c[q.x][q.y],q.d);
62 V[q.x][q.y]=visited[q.x][q.y]=true;
63 }
64 }
65 }
66 }
67
68 bool vis[400];
69 int from[10000];
70 vector<int>ve[400];
71
72 int march(int u){
73 int i, v;
74 for(i=0;i<ve[u].size();i++){
75 v=ve[u][i];
76 if(!vis[v]){
77 vis[v]=true;
78 if(from[v]==-1||march(from[v])){
79 from[v]=u;
80 return 1;
81 }
82 }
83 }
84 return 0;
85 }
86
87 main()
88 {
89 int i, j, k;
90 while(scanf("%d %d",&n,&m)==2){
91 for(i=0;i<n;i++) scanf("%s",map[i]);
92 int temp=0, cnt=0;
93 for(i=0;i<n;i++){
94 for(j=0;j<m;j++){
95 if(map[i][j]==‘.‘){
96 c[i][j]=temp++;
97 }
98 else if(map[i][j]==‘D‘){
99 a[cnt++]=node(i,j,0);
100 }
101 }
102 }
103 memset(V,false,sizeof(V));
104 for(i=0;i<cnt;i++){
105 bfs(i);
106 }
107 int ff=1;
108 for(i=0;i<n;i++){
109 for(j=0;j<m;j++){
110 if(!V[i][j]&&map[i][j]==‘.‘){
111 ff=0;
112 }
113 }
114 }
115 if(!ff){
116 printf("impossible\n");continue;
117 }
118 for(i=0;i<cnt;i++) sort(b[i],b[i]+temp,cmp);
119 for(i=0;i<temp;i++) ve[i].clear();
120 int t=1;
121 while(1){
122 for(i=0;i<cnt;i++){
123 for(j=0;j<temp;j++){
124 if(b[i][j].dis<=t){
125 ve[b[i][j].id].push_back(i+cnt*(t-1));
126 }
127 else break;
128 }
129 }
130 memset(from,-1,sizeof(from));
131 int f=1;
132 for(i=0;i<temp;i++){
133 memset(vis,false,sizeof(vis));
134 if(!march(i)){
135 f=0;break;
136 }
137 }
138 if(f) break;
139 t++;
140 }
141 printf("%d\n",t);
142 }
143 }