在一家博物馆,有一件很珍贵的珠宝放在一个房间里。博物馆的房间N×M网格呈现。博物馆的所有房间都与相邻的房间相连。有一名叫山姆的小偷打算偷这件宝珠。他设法弄到一些房间的钥匙,他从网格左上角出发单元格所表示的房间进入博物馆。山姆有钥匙的房间表示为1,山姆没有钥匙的房间表示为0,有珠宝的房间表示为9.
写一个算法,如果山姆到达有珠宝的房间,输出为1,否则,输出为0。
输入:
rows,一个整数,表示网格行数;
columns,一个整数,表示网格列数;
grid,表示一个二维的整数网格。
输出:
山姆到达有珠宝的房间,输出为1,否则,输出为0。
示列1
输入:
rows=3
columns=4
grid=
1 1 1 1
0 1 0 0
0 1 9 1
输出 :1
解释:从左上角开始,山姆可以通过路径(0,0)->(0,1)->(1,1)->(2,1)->(2,2)
示列2
输入:
rows=3
columns=3
grid=
0 0 0
9 1 1
0 1 1
输出: 0
解释:从左上角开始,无法到达珠宝房间,输出为0
import java.util.ArrayList;
public class Main {
public static void main(String args[]) {
int[][] lu = {
{1, 1, 1, 1},
{0, 1, 0, 0},
{0, 1, 9, 1},
};
int i = find(3, 4, lu);
System.out.println(i);
}
private static int find(int rows, int columns, int[][] grid) {
if (grid[0][0] == 9) {
return 1;
}
if (grid[0][0] == 0) {
return -1;
}
return core(rows, columns, grid, 0, 0);
}
private static int core(int rows, int columns, int[][] grid, int startr, int startc) {
if (grid[startr][startc] == 9)
return 1;
grid[startr][startc] = 0;
ArrayList<ArrayList> arrayLists = new ArrayList<>();
arrayLists = getNext(startr, startc);
int res = 0;
for (int i = 0; i < arrayLists.size(); i++) {
if (VerifyNext(rows, columns, grid, arrayLists.get(i))) {
res += core(rows, columns, grid, (Integer) arrayLists.get(i).get(0), (Integer) arrayLists.get(i).get(1));
}
}
if (res == 0)
return 0;
if (res >= 1)
return 1;
return 0;
}
private static boolean VerifyNext(int rows, int columns, int[][] grid, ArrayList arrayList) {
boolean res = false;
if ((Integer) arrayList.get(0) <= rows - 1 && (Integer) arrayList.get(0) >= 0 && (Integer) arrayList.get(1) <= columns - 1 && (Integer) arrayList.get(1) >= 0) {
if (grid[(Integer) arrayList.get(0)][(Integer) arrayList.get(1)] != 0) {
res = true;
}
}
return res;
}
private static ArrayList<ArrayList> getNext(int startr, int startc) {
ArrayList<ArrayList> res = new ArrayList<>();
ArrayList<ArrayList> df_list = new ArrayList<>();
ArrayList<Integer> list1 = new ArrayList();
ArrayList<Integer> list2 = new ArrayList();
ArrayList<Integer> list3 = new ArrayList();
ArrayList<Integer> list4 = new ArrayList();
list1.add(0);
list1.add(1);
list2.add(1);
list2.add(0);
list3.add(0);
list3.add(-1);
list4.add(-1);
list4.add(0);
df_list.add(list1);
df_list.add(list2);
df_list.add(list3);
df_list.add(list4);
for (int i = 0; i < df_list.size(); i++) {
ArrayList<Integer> temp = new ArrayList<>();
temp.add((startr + (Integer) df_list.get(i).get(0)));
temp.add((startc + (Integer) df_list.get(i).get(1)));
res.add(temp);
}
return res;
}
}