前几天就在写这题,听了队友的思路,他ac了,然后我照着他的思路写了一发Java,刚开始忘了多组数据输入,一直wa,然后改了之后更崩溃了,因为一直报数组溢出错误,一直没发现错误,我还以为是数据有问题。。。结果今天心血来潮去看了下别人的代码,终于发现有一个Java AC的了,然后我又有信心了。自己随便造了组数据,一下子发现错误了。。原来有个低级错误
出错的地方:
for(int i=0;i<4;i++){
int tx=sx+res[i][0];
int ty=sy+res[i][1];
if(map[tx][ty]=='E'){//就是这里!!!!,下面判断了边界,这里忘了。。
return step+1;
}
if(step>ans2)
return 10000;
if(isin(tx,ty)&&(map[tx][ty]=='.'||map[tx][ty]=='E')&&!flag[tx][ty]){
flag[tx][ty]=true;
q.add(new point(tx,ty,step+1));
}
}
AC代码:
/*
* 思路是比较火山口和出口的哈密顿距离ans1与人和出口的最短距离ans2,如果ans1大于ans2则不能生还。
*
*
*/
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int n,m;
static char map[][]=new char[1005][1005];
static boolean flag[][]=new boolean[1005][1005];
static int res[][]={{1,0},{-1,0},{0,1},{0,-1}};
static long ans1;
static long ans2;
static boolean isin(int x,int y){
return x>=0&&x<n&&y>=0&&y<m;
}
static class point{
int x,y,step;
public point(int x,int y,int step){
super();
this.x=x;
this.y=y;
this.step=step;
}
}
static int bfs(int sx,int sy,int step){
point p=new point(sx,sy,step);
Queue<point> q=new LinkedList<point>();
q.add(p);
flag[sx][sy]=true;
while(!q.isEmpty()){
point tp=q.poll();
sx=tp.x;
sy=tp.y;
step=tp.step;
if(map[sx][sy]=='E'){
return step;
}
if(step>ans2)
return 10000;
for(int i=0;i<4;i++){
int tx=sx+res[i][0];
int ty=sy+res[i][1];
if(isin(tx,ty)&&(map[tx][ty]=='.'||map[tx][ty]=='E')&&!flag[tx][ty]){
flag[tx][ty]=true;
q.add(new point(tx,ty,step+1));
}
}
}
return 10000;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
n=sc.nextInt();
m=sc.nextInt();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
flag[i][j]=false;
}
}
int sx=0,sy=0,fx=0,fy=0,ex=0,ey=0;
for(int i=0;i<n;i++){
String s=sc.next();
for(int j=0;j<m;j++){
map[i][j]=s.charAt(j);
if(map[i][j]=='S'){
sx=i;
sy=j;
}else if(map[i][j]=='F'){
fx=i;
fy=j;
}else if(map[i][j]=='E'){
ex=i;
ey=j;
}
}
}
ans2=Math.abs(ex-fx)+Math.abs(ey-fy);
ans1=bfs(sx,sy,0);
if(ans1<=ans2)
System.out.println("PIG PIG PIG!");
else
System.out.println("A! WO SI LA!");
}
sc.close();
}
}