1 /* 2 bfs+标记状态 3 如何记录状态是关键!! 4 */ 5 #include<stdio.h> 6 #include<string.h> 7 #include<stdlib.h> 8 #include<algorithm> 9 #include<iostream> 10 #include<queue> 11 #include<stack> 12 #include<math.h> 13 #include<map> 14 using namespace std; 15 const int maxn = 115; 16 const int inf = 9999999; 17 char mat[ maxn ][ maxn ]; 18 int vis[ maxn ][ maxn ][ 2 ][ 2 ]; 19 const int dx[]={1,-1,0,0}; 20 const int dy[]={0,0,1,-1}; 21 struct Pos{ 22 int x,y; 23 }; 24 struct Node{ 25 int x,y,ti; 26 int D,E;//flag 27 }; 28 Pos D,S,E; 29 void init(){ 30 for( int i=0;i<maxn;i++ ) 31 for( int j=0;j<maxn;j++ ) 32 mat[i][j] = 'X'; 33 } 34 35 bool in( Node p,int n,int m ){ 36 if( p.x>=0&&p.x<n&&p.y>=0&&p.y<m ) 37 return true; 38 else 39 return false; 40 } 41 bool Judge1( Node tmp ){ 42 int x = tmp.x; 43 int y1 = min( tmp.y,D.y ); 44 int y2 = max( tmp.y,D.y ); 45 for( int i=y1+1;i<y2;i++ ){ 46 if( mat[x][i]=='X' ) return false; 47 else if( mat[x][i]=='.' ){ 48 if( x==D.x&&i==D.y ) return false; 49 else if( x==E.x&&i==E.y ) return false; 50 } 51 } 52 return true; 53 } 54 bool Judge2( Node tmp ){ 55 int x = tmp.x; 56 int y1 = min( tmp.y,E.y ); 57 int y2 = max( tmp.y,E.y ); 58 for( int i=y1+1;i<y2;i++ ){ 59 if( mat[x][i]=='X' ) return false; 60 else if( mat[x][i]=='.' ){ 61 if( x==D.x&&i==D.y ) return false; 62 else if( x==E.x&&i==E.y ) return false; 63 } 64 } 65 return true; 66 } 67 bool Judge3( Node tmp ){ 68 int y = tmp.y; 69 int x1 = min( tmp.x,D.x ); 70 int x2 = max( tmp.x,D.x ); 71 for( int i=x1+1;i<x2;i++ ){ 72 if( mat[i][y]=='X' ) return false; 73 else if( mat[i][y]=='.' ){ 74 if( i==D.x&&y==D.y ) return false; 75 else if( i==E.x&&y==E.y ) return false; 76 } 77 } 78 return true; 79 } 80 bool Judge4( Node tmp ){ 81 int y = tmp.y; 82 int x1 = min( tmp.x,E.x ); 83 int x2 = max( tmp.x,E.x ); 84 for( int i=x1+1;i<x2;i++ ){ 85 if( mat[i][y]=='X' ) return false; 86 else if( mat[i][y]=='.' ){ 87 if( i==D.x&&y==D.y ) return false; 88 else if( i==E.x&&y==E.y ) return false; 89 } 90 } 91 return true; 92 } 93 94 int bfs( int n,int m,int aim_ti ){ 95 Node cur,nxt; 96 cur.x = S.x; 97 cur.y = S.y; 98 cur.ti = 0; 99 cur.D = cur.E = 0; 100 queue<Node>q; 101 while( !q.empty() ) 102 q.pop(); 103 q.push( cur ); 104 int ans = inf; 105 vis[ cur.x ][ cur.y ][ cur.D ][ cur.E ] = 1; 106 while( !q.empty() ){ 107 cur = q.front(); 108 q.pop(); 109 if( cur.ti>aim_ti ) continue; 110 //printf("cur:x=%d,y=%d,ti=%d ",cur.x,cur.y,cur.ti); 111 if( cur.x==D.x&&Judge1( cur )==true ) cur.D = 1; 112 if( cur.x==E.x&&Judge2( cur )==true ) cur.E = 1; 113 if( cur.y==D.y&&Judge3( cur )==true ) cur.D = 1; 114 if( cur.y==E.y&&Judge4( cur )==true ) cur.E = 1; 115 if( cur.D==1 ) { 116 if( cur.E==1 ){ 117 if( ans>cur.ti ){ 118 ans = cur.ti; 119 } 120 } 121 } 122 //printf("ans:%d ",ans); 123 for( int i=0;i<4;i++ ){ 124 nxt = cur; 125 nxt.x+=dx[i]; 126 nxt.y+=dy[i]; 127 nxt.ti++; 128 if( in( nxt,n,m )==true&&mat[nxt.x][nxt.y]!='X'&&vis[nxt.x][nxt.y][nxt.D][nxt.E]==0 ){ 129 vis[nxt.x][nxt.y][nxt.D][nxt.E] = 1; 130 q.push(nxt); 131 } 132 } 133 } 134 if( ans>aim_ti ) return -1; 135 else return ans; 136 } 137 138 int main(){ 139 int ca,T; 140 scanf("%d",&ca); 141 T = 1; 142 while( ca-- ){ 143 int n,m,aim_ti; 144 printf("Case %d: ",T++); 145 init(); 146 scanf("%d%d%d",&n,&m,&aim_ti); 147 for( int i=0;i<n;i++ ){ 148 scanf("%s",mat[i]); 149 for( int j=0;j<m;j++ ){ 150 if( mat[i][j]=='D' ){ 151 D.x = i; 152 D.y = j; 153 mat[i][j]='X'; 154 } 155 else if( mat[i][j]=='S' ){ 156 S.x = i; 157 S.y = j; 158 mat[i][j]='.'; 159 } 160 else if( mat[i][j]=='E' ){ 161 E.x = i; 162 E.y = j; 163 mat[i][j]='X'; 164 } 165 } 166 } 167 memset( vis,0,sizeof( vis ) ); 168 int ans = bfs( n,m,aim_ti ); 169 printf("%d ",ans); 170 } 171 return 0; 172 }