java.lang.NullPointerException
空指针异常 找了半天没找到
有会的指导一下吗
java.lang.NullPointerException
package Search;
import java.io.IOException;
import java.util.Scanner;
public class Chuanyueleichi1 {
/*
* 题目描述
X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,
否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),
怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了A,B区,
其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
坦克车只能水平或垂直方向上移动到相邻的区。
输入格式
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
输出格式
要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1
样例输入
5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
样例输出
10
思想
1.图的广度优先算法 直接算出最短路径所用,数据结构 队列(在chuanyueleichi2中具体实现)
2.图的深度优先算法 遍历所有路径,求出最小路径(具体在本类实现)
步骤
一.建立全局变量
1.坐标(x,y)
2.当前区域辐射值
3.达到该区所走步数
二.输入,初始化节点
1.找到A区位置,并赋值给dfs入口
三.dfs建立
1.注意回溯
*/
public static String[][] arr = new String[101][101] ;
public static int n = 0;//雷区大小
public static int x =0,y =0;
public static int min = 0;//记录到达B区最小步数
public static int[][] visit = new int[101][101];//标记已走过的雷区 初始值为0 表示都没走过
public static int []fx = {1,0,-1,0};
public static int []fy = {0,-1,0,-1};//表示移动方向分别是 下 右 上 左
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
n = sc.nextInt();//雷区大小
int a = 0,b=0;
//arr = new String[n+1][n+1];
//visit = new int[n+1][n+1];
for(int i = 1 ; i <= n; i++) {
for(int j = 1 ; j<= n ;j++) {
arr[i][j] = sc.next();
if(arr[i][j].equals("A")) {
a = i;
b = j;
}
}
}
dfs(a,b,"o",0);
System.out.println(min);
}
//输入为坐标 当前的状态(+,-,A,B),当前的步数
private static void dfs(int x, int y, String status, int step) {
// TODO Auto-generated method stub
if(arr[x][y].equals("B")) {
min = Math.min(step, min);
return ;
}
int x1 = 0 ,y1 = 0;//表示移动的坐标
for(int i = 0 ; i < 4 ;i++) {
x1 = x +fx[i];
y1 = y +fy[i];
//判断接下来的雷区是否符合要求 且没有重复
if( is(x1,y1,x,y)&&visit[x1][y1]!=1) {
//符合的话 标记 已访问
visit[x1][y1]=1;
dfs(x1,y1,arr[x1][y1],step+1);//进入递归
//当前递归结束 访问标记位取消 以免 访问不到B区(如果有B 区的话)
visit[x1][y1]=0;
}
}
}
private static boolean is(int x1, int y1,int x,int y) {
// TODO Auto-generated method stub
if(x1 >= 0&& x1 <= n && y1 >= 0&& y1 <=n&&arr[x1][y1]!=arr[x][y])
return true;
return false;
}
}
Exception in thread "main" java.lang.NullPointerException
at BlueCup/Search.Chuanyueleichi1.dfs(Chuanyueleichi1.java:90)
at BlueCup/Search.Chuanyueleichi1.dfs(Chuanyueleichi1.java:103)
at BlueCup/Search.Chuanyueleichi1.dfs(Chuanyueleichi1.java:103)
at BlueCup/Search.Chuanyueleichi1.dfs(Chuanyueleichi1.java:103)
at BlueCup/Search.Chuanyueleichi1.dfs(Chuanyueleichi1.java:103)
at BlueCup/Search.Chuanyueleichi1.main(Chuanyueleichi1.java:83)