Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 深度优先搜索错误?_Java_Algorithm_Depth First Search - Fatal编程技术网

Java 深度优先搜索错误?

Java 深度优先搜索错误?,java,algorithm,depth-first-search,Java,Algorithm,Depth First Search,所以我有一个N×M的矩阵,在给定的位置,我有一个代表颜色的值。如果该点没有任何内容,则该值为-1。我需要做的是在我添加一个新点后,检查所有具有相同颜色值的相邻点,如果超过2个,则将它们全部设置为-1 如果我说的没有意义,我想做的是一个算法,我用它来消除屏幕上所有相同颜色的气泡,气泡被存储在一个矩阵中,-1表示没有气泡,{0,1,2,…}表示有一个特定颜色的气泡 另外,如果你有任何建议,我将不胜感激。谢谢 这就是我尝试过但失败的地方: public class Testing { sta

所以我有一个N×M的矩阵,在给定的位置,我有一个代表颜色的值。如果该点没有任何内容,则该值为
-1
。我需要做的是在我添加一个新点后,检查所有具有相同颜色值的相邻点,如果超过2个,则将它们全部设置为
-1

如果我说的没有意义,我想做的是一个算法,我用它来消除屏幕上所有相同颜色的气泡,气泡被存储在一个矩阵中,
-1
表示没有气泡,
{0,1,2,…}
表示有一个特定颜色的气泡

另外,如果你有任何建议,我将不胜感激。谢谢 这就是我尝试过但失败的地方:

public class Testing {

    static private int[][] gameMatrix=
        {{3, 3, 4, 1, 1, 2, 2, 2, 0, 0},
        {1, 4, 1, 4, 2, 2, 1, 3, 0, 0},
        {2, 2, 4, 4, 3, 1, 2, 4, 0, 0},
        {0, 4, 2, 3, 4, 1, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
        };

    static int Rows=6;
    static int Cols=10;
    static int count;
    static boolean[][] visited=new boolean[15][15];
    static int NOCOLOR = -1;
    static int color = 1;

    public static void dfs(int r, int c, int color, boolean set)
    {
        for(int dr = -1; dr <= 1; dr++) 
            for(int dc = -1; dc <= 1; dc++)
                if(!(dr == 0 && dc == 0) && ok(r+dr, c+dc))
                {
                    int nr = r+dr;
                    int nc = c+dc;

                    // if it is the same color and we haven't visited this location before
                    if(gameMatrix[nr][nc] == color && !visited[nr][nc]) 
                    {
                        visited[nr][nc] = true;
                        count++;

                        dfs(nr, nc, color, set);

                        if(set)
                        {
                            gameMatrix[nr][nc] = NOCOLOR;
                        }
                    }
                }
    }

    static boolean ok(int r, int c)
    {
        return r >= 0 && r < Rows && c >= 0 && c < Cols;
    }

    static void showMatrix(){
        for(int i = 0; i < gameMatrix.length; i++) {
            System.out.print("[");
            for(int j = 0; j < gameMatrix[0].length; j++) {
                System.out.print(" " + gameMatrix[i][j]);
            }
            System.out.println(" ]");
        }
        System.out.println();

    }

    static void putValue(int value,int row,int col){
        gameMatrix[row][col]=value;
    }

    public static void main(String[] args){
        System.out.println("Initial Matrix:"); 
        putValue(1, 4, 1);
        putValue(1, 5, 1);
        putValue(1, 4, 2);
        showMatrix();

        for(int n = 0; n < Rows; n++)
            for(int m = 0; m < Cols; m++)
                visited[n][m] = false;

        //reset count
        count = 0;
        dfs(5,1,color,false);
        //if there are more than 2 set the color to NOCOLOR
        for(int n = 0; n < Rows; n++)
            for(int m = 0; m < Cols; m++)
                visited[n][m] = false;
        if(count > 2)
        {
            dfs(5,1,color,true);
        }
        System.out.println("Matrix after dfs:");
        showMatrix();
    }

}
公共类测试{
静态私有int[][]游戏矩阵=
{{3, 3, 4, 1, 1, 2, 2, 2, 0, 0},
{1, 4, 1, 4, 2, 2, 1, 3, 0, 0},
{2, 2, 4, 4, 3, 1, 2, 4, 0, 0},
{0, 4, 2, 3, 4, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
};
静态int行=6;
静态int Cols=10;
静态整数计数;
静态布尔值[][]已访问=新布尔值[15][15];
静态int NOCOLOR=-1;
静态int-color=1;
公共静态void dfs(int r、int c、int color、布尔集)
{

对于(int-dr=-1;dr您的代码也将对角单元格计算为相邻单元格。如果您只需要左/右/上/下单元格,则可以进行检查

if(!(dr == 0 && dc == 0) && ok(r+dr, c+dc) && dr * dc == 0)

您还需要计算第一个单元格的数量。您不需要计算起始单元格的数量。

您的代码也将对角单元格计算为相邻单元格。如果您只需要左/右/上/下单元格,则可以进行检查

if(!(dr == 0 && dc == 0) && ok(r+dr, c+dc) && dr * dc == 0)

您还需要计算第一个单元格的数量。您不需要计算您开始的单元格的数量。

我认为您是在寻找a(可能有一个稍微奇怪的限制,即必须至少有两个相同颜色的相邻单元格)?我不确定为什么深度优先搜索适用于此。

我认为您是在寻找a(可能有一个稍微奇怪的约束条件,即必须至少有两个颜色相同的邻居)?我不确定为什么深度优先搜索在这里合适。

您遇到的一个问题是,您没有检查最上面一行和最左边的列:

static boolean ok(int r, int c)
{
    return r > 0 && r < Rows && c > 0 && c < Cols;
}
静态布尔ok(int r,int c)
{
返回r>0&&r0&&c
您应该检查
r>=0
c>=0


第二个问题是您使用了两次
dfs()
,但是
已访问的
字段是静态的-在第二次运行
dfs()之前,所有字段都设置为
true
在第二次运行之前,您需要在所有字段中将其初始化回
false
,否则算法将立即终止而不做任何操作[因为所有节点都已在访问的
-并且算法将决定不重新浏览这些节点。].

您遇到的一个问题是您没有检查最上面一行和最左边的列:

static boolean ok(int r, int c)
{
    return r > 0 && r < Rows && c > 0 && c < Cols;
}
静态布尔ok(int r,int c)
{
返回r>0&&r0&&c
您应该检查
r>=0
c>=0


第二个问题是您使用了两次
dfs()
,但是
已访问的
字段是静态的-在第二次运行
dfs()之前,所有字段都设置为
true
在第二次运行之前,您需要在所有字段中将其初始化回
false
,否则算法将立即终止而不做任何操作[因为所有节点都已在访问的
-并且算法将决定不重新浏览这些节点。]

(添加以获得语法突出显示并吸引更多人;如果这是错误的,请编辑)ok 10x:D-和其他字符,以便我可以实际发布评论-(添加以获得语法突出显示并吸引更多人;如果这是错误的,请编辑)好的,10x:D-和其他字符,这样我就可以发表评论了-@Fofole似乎你不算你启动的第一个单元格from@Fofole似乎你不算你启动的第一个细胞from@Fofole:再看第二个问题。结论是:D我认为这解决了我的问题。谢谢。@Fofole:那么这可能是另一个问题。试着用调试器,并找出它发生的时间和原因。如果仍然找不到它-发布新代码[经过最新修改]和算法失败的示例输入[输入、预期输出和实际输出]。非常感谢你所做的一切。我确实发现了问题。你帮了我很大的忙,希望我能给你更多的帮助。谢谢你。我很高兴我能帮上忙。祝你好运!@Fofole:看看第二个问题。这就结束了:D我认为这解决了我的问题。谢谢。@Fofole:那么这可能是一个额外的问题。试试第二步使用调试器ping并找出它发生的时间和原因。如果仍然找不到它-发布新代码[经过最新修改]和算法失败的示例输入[输入、预期输出和实际输出]。非常感谢你所做的一切。我真的发现了问题。你帮了我很大的忙,希望我能给你更多的帮助。1:D非常欢迎你。我很高兴我能帮上忙。祝你好运!