import java.util.*;
public class Main{
static char[][]map;
static int R;
static int C;
static boolean [][] flag;
static int [][]next= {{-1,0},//四个位移矢量
{1,0},
{0,-1},
{0,1}};
public static void main(String[]args)
{
Scanner fin=new Scanner(System.in);
R=fin.nextInt();
C=fin.nextInt();
fin.nextLine();
map=new char[R][C];
Point S = null,T=null;
for(int i=0;i<R;i++)
{
String s=fin.nextLine();
for(int j=0;j<C;j++)
{ map[i][j]=s.charAt(j);
if(s.charAt(j)=='S')
S=new Point(i,j);
if(s.charAt(j)=='T')
T=new Point(i,j);
}
}
int cnt=0;
if(func(S,T)==false)
{
System.out.println("I'm stuck!");
return;
}
for(int i=0;i<R;i++)
for(int j=0;j<C;j++)
{
Point temp=new Point(i,j);
if(funcS,temp)==true)
if(func(temp,T)==false)
cnt++;
}
System.out.println(cnt);
fin.close();
}
public static boolean isOk(Point p)//判断p点是否能否到达
{
if(p.x>=0&&p.x<R)
if(p.y>=0&&p.y<C)
if(flag[p.x][p.y]==false)//未被遍历过的才符合要求
if(map[p.x][p.y]!='#')
return true;
return false;
}
public static boolean func(Point a,Point b)//判断是否能从a点到达b点
{
if(a.equals(b))
return true;
Queue<Point> q=new LinkedList<Point>();
q.add(a);
flag=new boolean[R][C];
flag[a.x][a.y]=true;
while(q.isEmpty()==false)//借助队列进行广度优先搜索
{
Point top=new Point(q.remove());
switch(map[top.x][top.y])
{
case '-':
for(int i=2;i<=3;i++)
{
Point nextPoint=new Point(top.x+next[i][0],top.y+next[i][1]);
if(isOk(nextPoint))
{
if(nextPoint.equals(b))
return true;
q.add(nextPoint);
flag[nextPoint.x][nextPoint.y]=true;
}
}
break;
case'S':
case'T':
case'+':
for(int i=0;i<=3;i++)
{
Point nextPoint=new Point(top.x+next[i][0],top.y+next[i][1]);
if(isOk(nextPoint))
{
if(nextPoint.equals(b))
return true;
q.add(nextPoint);
flag[nextPoint.x][nextPoint.y]=true;
}
}
break;
case'.':
for(int i=1;i<=1;i++)
{
Point nextPoint=new Point(top.x+next[i][0],top.y+next[i][1]);
if(isOk(nextPoint))
{
if(nextPoint.equals(b))
return true;
q.add(nextPoint);
flag[nextPoint.x][nextPoint.y]=true;
}
}
break;
case'|':
for(int i=0;i<=1;i++)
{
Point nextPoint=new Point(top.x+next[i][0],top.y+next[i][1]);
if(isOk(nextPoint))
{
if(nextPoint.equals(b))
return true;
q.add(nextPoint);
flag[nextPoint.x][nextPoint.y]=true;
}
}
}
}
return false;
}
};
class Point{//定义点坐标类
int x;
int y;
Point(int x0,int y0){
x=x0;
y=y0;
}
Point(Point p)
{
x=p.x;
y=p.y;
}
public boolean equals(Point b)
{
if(x==b.x)
if(y==b.y)
return true;
return false;
}
}
I'm stuck
最新推荐文章于 2020-09-07 20:24:34 发布