#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include<queue>
#include <iostream>
using namespace std;
int w,h;
char map[41][41];
char map1[41][41];
char map2[41][41];
int ok;
int xx[]={9,0 ,-1, 0, 1}; //左,上 右 下
int yy[]={9,-1, 0, 1, 0};
int ldx1[]={9, 1 , 0 , -1 }; //下 左 上
int ldy1[]={9, 0 ,-1 , 0 };
int ldx2[]={9, 0 , -1 , 0 };
int ldy2[]={9,-1 , 0 , 1 }; //左上 右
int ldx3[]={9, -1 , 0 , 1 };
int ldy3[]={9, 0 , 1 , 0 }; //上 右 下
int ldx4[]={9, 0 , 1 , 0 }; //右 下 左
int ldy4[]={9, 1 , 0 , -1 };
int rdx1[]={9,-1 , 0 , 1 };
int rdy1[]={9, 0 ,-1 , 0 }; // 上 左 下
int rdx2[]={9, 0 , -1 , 0 };
int rdy2[]={9, 1 , 0 , -1 }; // 右上左
int rdx3[]={9, 1 , 0 , -1 };
int rdy3[]={9, 0 , 1 , 0 }; // 下右 上
int rdx4[]={9, 0 , 1 , 0 };
int rdy4[]={9, -1 , 0 , 1 }; // 左 下 右
struct node
{
int x,y;
};
queue <node> qq;
node point;
node track[1600][1600];
int lk,rk,bk,lsign,rsign;
int startx,starty,endx,endy;
int main()
{
int is_board(int r, int c);
int ldfs(int r,int c,int posi);
int rdfs(int r,int c,int posi);
int bfs(int r, int c);
int countt(node a);
int i,j,t;
scanf("%d",&t);
int posi;
while(t--)
{
//
memset(track,0,sizeof(track)); 由于用不到这么多。如果memset了相当于全部用了,用来填零,造成内存急剧增加
scanf("%d%d",&w,&h);
getchar();
while ( !qq.empty())
{
qq.pop();
}
for (i=1;i<=h;i++)
{
for (j=1;j<=w;j++)
{
scanf("%c",&map[i][j]);
map1[i][j]=map[i][j];
map2[i][j]=map1[i][j];
if (map[i][j]=='S') {startx=i; starty=j; }
if (map[i][j]=='E') { endx=i; endy=j;}
}
getchar();
}
for (i=1;i<=4;i++)
{
if (is_board(startx+xx[i],starty+yy[i]) && map[startx+xx[i]][starty+yy[i]]=='.' )
posi=i;
}
lk=0;
lsign=0;
ldfs(startx,starty,posi);
rk=0;
rsign=0;
rdfs(startx,starty,posi);
bk=0;
ok=0;
point.x=startx;
point.y=starty;
node endd;
endd.x=endx;
endd.y=endy;
qq.push(point);
bfs(startx,starty);
countt(endd);
printf("%d %d %d\n",lk+2,rk+2,bk);
}
return 0;
}
int is_board(int r, int c)
{
if ( r>=1 && r<=h && c>=1 && c<=w) return 1;
return 0;
}
int ldfs(int r,int c,int posi)
{
int ldx[5];
int ldy[5];
int i;
if (map[r][c]=='E') {lsign=1;return 0;}
if (lsign==1) return 0;
if (posi==1)
{
for (i=1;i<=4;i++)
{
ldx[i]=ldx1[i];
ldy[i]=ldy1[i];
}
}
if (posi==2)
{
for (i=1;i<=4;i++)
{
ldx[i]=ldx2[i];
ldy[i]=ldy2[i];
}
}
if (posi==3)
{
for (i=1;i<=4;i++)
{
ldx[i]=ldx3[i];
ldy[i]=ldy3[i];
}
}
if (posi==4)
{
for (i=1;i<=4;i++)
{
ldx[i]=ldx4[i];
ldy[i]=ldy4[i];
}
}
for (i=1;i<=3;i++)
{
if ( is_board(r+ldx[i],c+ldy[i]) && map[r+ldx[i]][c+ldy[i]]=='.' ||map[r+ldx[i]][c+ldy[i]]=='E')
{
if (map[r+ldx[i]][c+ldy[i]]=='E') {lsign=1;return 0;}
if (ldx[i]==0 && ldy[i]==-1 )
posi=1;
if (ldx[i]==-1 && ldy[i]== 0 )
posi=2;
if (ldx[i]==0 && ldy[i]== 1 )
posi=3;
if (ldx[i]==1 && ldy[i]== 0 )
posi=4;
//
map[r+ldx[i]][c+ldy[i]]='#'; //因为此处没屏蔽 一直tle!!!!!!!!!!!
lk++;
ldfs(r+ldx[i],c+ldy[i],posi);
if (lsign==1) return 0;
//
map[r+ldx[i]][c+ldy[i]]='.'; //因为此处没屏蔽 一直tle!!!!!!!!!!!
lk++;
}
}
return 0;
}
int rdfs(int r,int c,int posi)
{
int rdx[5];
int rdy[5];
int i;
if (map1[r][c]=='E') {rsign=1;return 0;}
if (rsign==1) return 0;
if (posi==1)
{
for (i=1;i<=4;i++)
{
rdx[i]=rdx1[i]; //此处rdx1粗心写成ldx1
rdy[i]=rdy1[i];
}
}
if (posi==2)
{
for (i=1;i<=4;i++)
{
rdx[i]=rdx2[i];
rdy[i]=rdy2[i];
}
}
if (posi==3)
{
for (i=1;i<=4;i++)
{
rdx[i]=rdx3[i];
rdy[i]=rdy3[i];
}
}
if (posi==4)
{
for (i=1;i<=4;i++)
{
rdx[i]=rdx4[i];
rdy[i]=rdy4[i];
}
}
for (i=1;i<=3;i++) // 此处3粗心写成4
{
if ( is_board(r+rdx[i],c+rdy[i]) && map1[r+rdx[i]][c+rdy[i]]=='.' ||map1[r+rdx[i]][c+rdy[i]]=='E' )
{
if (map1[r+rdx[i]][c+rdy[i]]=='E') {rsign=1;return 0;}
if (rdx[i]==0 && rdy[i]==-1 )
posi=1;
if (rdx[i]==-1 && rdy[i]== 0 )
posi=2;
if (rdx[i]==0 && rdy[i]== 1 )
posi=3;
if (rdx[i]==1 && rdy[i]== 0 )
posi=4;
//
map1[r+rdx[i]][c+rdy[i]]='#'; //因为此处没屏蔽 一直tle!!!!!!!!!!!
rk++;
rdfs(r+rdx[i],c+rdy[i],posi);
if (rsign==1) return 0;
//
map1[r+rdx[i]][c+rdy[i]]='.'; //因为此处没屏蔽 一直tle!!!!!!!!!!!
rk++;
}
}
return 0;
}
int countt(node a)
{
if (a.x==startx&&a.y==starty) {bk++;return 0;}
else
{
countt(track[a.x][a.y]);
bk++;
}
return 0;
}
int bfs(int r, int c)
{
while ( !qq.empty() )
{
node tmp;
node son=qq.front();
int i;
for ( i=1;i<=4;i++)
{
if ( is_board(son.x+xx[i],son.y+yy[i]) && map2[son.x+xx[i]][son.y+yy[i]]=='.' ||map2[son.x+xx[i]][son.y+yy[i]]=='E')
{
tmp.x=son.x+xx[i];
tmp.y=son.y+yy[i];
track[tmp.x][tmp.y]=qq.front();
if (map2[son.x+xx[i]][son.y+yy[i]]=='E') { ok=1;return 0;}
map2[son.x+xx[i]][son.y+yy[i]]='#';
qq.push(tmp);
}
}
qq.pop();
}
return 0;
}
这题主要是题意太难读懂。。。。