我仍然在努力改进我的编码技巧,这个问题让我在我的轨道上旋转一点,所以任何帮助都非常感谢。我知道如何很容易地创建随机数组,没问题。然而,找到链条的逻辑对我来说非常困难。我认为正确的方法是某种深度优先搜索算法,但我不完全确定如何在这种情况下实现它,或者这是否是正确的。
我的基本问题是,我应该使用深度优先搜索,如果是,我应该递归吗?有关实施的任何提示或提示也欢迎!
创建一个随机创建3x3网格的程序 0 <= n <= 9的正数。程序应该 找到所有可能的数字组合,加起来的区域 网格,或9,使用这些规则(类似于Boggle):
一个。数字必须在顺序相邻的单元格中“链接”,其中 “相邻”细胞是水平,垂直和对角的细胞 相邻
湾链条不必排成一行。例如,它可以去 水平一次,然后垂直一次,最后是对角线一次
℃。至少必须在链中使用“网格宽度-1”单元格(a 3x3网格意味着必须至少使用两个单元格
d。链不能重复已使用的网格单元
即使用与先前链完全相同的细胞的链是 考虑重复,不应计算
我知道,对于每个元素,当您搜索每个相邻元素时,您必须检查并跟踪它之前是否已被访问过,因此您不会重复数字。
public class GridSolver {
int[][] workingGrid;
public GridSolver(int[][] workingGrid){
this.workingGrid = workingGrid;
}
public String solve(){
int length = this.workingGrid.length;
boolean[][] visited = new boolean[length][length];
for(int rows=0; rows<length; rows++){
for(int columns=0; columns<length; columns++){
if(visited[rows][columns] == false){
dfs(workingGrid[rows][columns]);
}
}
}
return null;
}
public HashSet<ArrayList<Integer>> dfs(int element){
HashSet<ArrayList<Integer>> chains = new HashSet<>();
checkLeft();
checkTopLeft();
checkTopMiddle();
checkTopRight();
checkRight();
checkBottomRight();
checkBottomMiddle();
checkBottomLeft();
return null;
}}
这是我到目前为止所知道的,它是相当草率的,而不是最好的思考方案,但这就是为什么我在这里我猜:P。
另外,为了解释我在代码中的一些想法,dfs()
方法的返回类型为HashSet,因为我知道你不能有重复的链,而且它是一组列表的链。此外,“check”方法没有实现,我只是将它们写下来,因为我知道你需要为每个数字处理这些相邻的每个块。
再一次,非常感谢任何帮助,谢谢你在这里作为一个初学者的幽默!