你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。
为了使收益最大化,矿工需要按以下规则来开采黄金:
每当矿工进入一个单元,就会收集该单元格中的所有黄金。
矿工每次可以从当前位置向上下左右四个方向走。
每个单元格只能被开采(进入)一次。
不得开采(进入)黄金数目为 0 的单元格。
矿工可以从网格中 任意一个 有黄金的单元格出发或者是停止。
public int getMaximumGold(int[][] grid) {
if (null == grid || grid.length == 0) return 0;
int[] dirx = {0,0,-1,1};
int[] diry = {-1,1,0,0};// 上下左右
int[] res={-1};
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] != 0) findGold( i, j, 0,res,grid,new boolean[grid.length][grid[0].length]);
}
}
return res[0];
}
private void findGold(int i, int j, int temp,int[] res,int[][] grid,boolean[][] access) {
if (i >= 0 && j >= 0 && i < grid.length && j < grid[0].length && grid[i][j] != 0
&& !access[i][j]) {
access[i][j] = true;
int n=temp+grid[i][j];
findGold(i+1,j,n,res,grid,access);
findGold(i-1,j,n,res,grid,access);
findGold( i,j+1,n,res,grid,access);
findGold( i,j-1,n,res,grid,access);
access[i][j] = false;
} else {
res[0] = Math.max(res[0], temp);
}
}
根据广度优先的思路解决,如果上下左右都可以走,就加入
1079. 活字印刷
你有一套活字字模 tiles,其中每个字模上都刻有一个字母 tiles[i]。返回你可以印出的非空字母序列的数目。
输入:"AAB"
输出:8
解释:可能的序列为 "A", "B", "AA", "AB", "BA", "AAB", "ABA", "BAA"。
public int numTilePossibilities(String tiles) {
// List<String> stringList=new ArrayList<>();
Set<String> stringList=new HashSet<>();
char[] chars=tiles.toCharArray();
findString(chars,0,new String(),new boolean[chars.length],stringList);
return stringList.size();
}
public void findString(char[] chars,int index,String str,boolean[] access, Set<String> stringList){
if (index>chars.length) return;
for (int i = 0; i < chars.length; i++) {
if (access[i])continue;
access[i]=true;
stringList.add(str+chars[i]);
findString(chars,index+1,str+chars[i],access,stringList);
access[i]=false;
}
}