Java 2D数组,查找包含元素
我有一个2D数组声明如下:Java 2D数组,查找包含元素,java,arrays,algorithm,math,2d,Java,Arrays,Algorithm,Math,2d,我有一个2D数组声明如下: private Dots[][] dots = new Dots[8][8]; 我正在制作一个用于教育目的的游戏,2D数组中填充了点,每个点都有一个从四种颜色中随机选择的颜色。游戏的目标是将这些点连接起来。当你连接相同颜色的点时,它们会被删除,你会得到它们的点数。目前一切正常,但我想添加一个新功能: 关闭路径时,该路径中包含的所有点也将被删除。(见图): 我正在考虑一个算法来找到路径中包含的所有点,但我想不出一个 路径存储在LinkedList中(可能与此无关,但我
private Dots[][] dots = new Dots[8][8];
我正在制作一个用于教育目的的游戏,2D数组中填充了点,每个点都有一个从四种颜色中随机选择的颜色。游戏的目标是将这些点连接起来。当你连接相同颜色的点时,它们会被删除,你会得到它们的点数。目前一切正常,但我想添加一个新功能:
关闭路径时,该路径中包含的所有点也将被删除。(见图):
我正在考虑一个算法来找到路径中包含的所有点,但我想不出一个
路径存储在LinkedList中(可能与此无关,但我只是想确认一下:)
所以,总结一下我的问题:我试图提出一种算法,在蓝点之间选择灰点
注:
- 点可以对角连接
- 路径可以是玩家想要的长度
- 闭合路径可以是任何形状
- 固溶体:
- 朴素的解决方案:
boolean select=true
)着色为灰色:
enum颜色{蓝色、灰色、白色};
布尔选择=假;
//逐行迭代
对于(int x=0;x<8;x++){
对于(整型y=0;y为灰色)
if(选择点[x][y].color==color.WHITE&&dots){
点[x][y]。颜色=颜色。灰色;
}
//如果我们点击另一个蓝色并处于选择->选择=false
if(选择点[x][y].color==color.BLUE&&dots){
select=false;
}
}
}
注:仍有一些案例有待解决:
e、 g.如果当前迭代行是垂直的蓝色墙,且长度为奇数,则它会错误地转到选择模式动态规划方法(n^2) 对于任何符合计数条件的单元格,您需要(i,j-1)、(i-1,j)和(i,j+1)、(i+1,j)。
注意:这个单元格不可能完全在那里,也可能在下面 创建一个布尔二维数组。
让我们以6×6以下的样本为例。
/*
T----
T-T----
T----
-T---
-T---
*/
其中T表示闭合路径 2次迭代:
第一名 首先遍历矩阵,如果发现(i,j-1)和(i-1,j)为真,则将该点包含在集合中(或任意集合)。 因为边界条件不包括在集合中,因为它们永远不会在闭合路径中,所以在第一次迭代结束时,您将 /*
T T F
t1 T F
T T F
F t1 F F
F t1 F F
*/
其中1表示集合中包含的点。
(这里您可能希望使用字符2d矩阵而不是布尔值。但是,如果您使用布尔值,那么它也可以工作,只需要执行set.contains(新点(i,j))) 第二名 做同样的事情,但从(n-1,n-1)开始,这次你检查(i+1,j),(i,j+1)点是否为真。对于二维矩阵中的任何点,如果你发现它应该是“F”,但它是“1”,然后从集合中移除该点 /*
T T F
t1 T F
T T F
F T F
F T F
*/ 因此,经过2次n^2次操作后,您将拥有包含所需点的集合 是1也将作为后续迭代的T。
简言之,与DP不同的是,我们从左上到右下,从右下到左上遍历,以准确找出闭合路径内的点。
F-不合格
T-仅可计数
1-与T相同,但也被添加到输出集中@uoyilmaz我一直在想这个算法,现在已经有一个多小时了,我想先得到顶部的所有瓷砖,它们的正下方没有蓝色的邻居,它们会一直向下,直到它们碰到一个,但我不确定它是否会起作用,恐怕不行。哈你研究过扫雷游戏的代码吗?如果我理解正确,我想这是类似的。因为它也填补了周围区域的空白。当你说找到封闭路径中包含的所有点时,你指的是这些点的计数,对吗?如果是,那么所有四个边上的点都不会参与计数(例如,(0,0),(3,0),(0,5))我真的不需要计数,我需要它们在2D中的索引array@skY确切地说:)linkedlist包含所选的点,但我可以轻松地执行getX()和getY()以获得它们在2D阵列中的位置,但可以让我在任何情况下都工作。例如,在循环中添加另一个布尔值和适当的条件,从而调整状态机我认为引入正确的方向和提供基础比提供完整的交钥匙解决方案更为充分。^@Gewure洪水填充算法肯定会有很大帮助,但我如何才能不使用“原始”(见示例答案代码)颜色,在您提供的示例中,我看不出他们是如何实现“边框”的。首先将矩阵涂成白色,然后迭代并将路径点涂成蓝色,然后运行我的原始解决方案或泛光填充。@生成的点矩阵将保留边框以及表示
enum COLOR { BLUE, GREY, WHITE};
boolean select = false;
// iterate row by row
for(int x = 0; x < 8; x++) {
for(int y = 0; y <8; y++) {
//select mode...
if(dots[x][y].color == COLOR.BLUE && !change) {
select = true;
}
//if we are in select and the current field is white -> make GREY
if(select && dots[x][y].color == COLOR.WHITE) {
dots[x][y].color = COLOR.GREY;
}
// if we hit another blue and are in select -> select = false
if(select && dots[x][y].color == COLOR.BLUE) {
select = false;
}
}
}