理解回溯(网格上的机器人)

时间:2016-02-02 09:19:20

标签: java backtracking

以下是在网格上移动的机器人的代码,该网格假设从左上角移动到右下角并找到到达右下方的独特方式:

import com.teamdev.jxbrowser.chromium.*;
import com.teamdev.jxbrowser.chromium.swing.DefaultNetworkDelegate;

/**
 * This sample demonstrates how to read and modify POST data of
 * HTTP request using NetworkDelegate.
 */
public class POSTDataSample {
    public static void main(String[] args) {
        Browser browser = new Browser();
        BrowserContext browserContext = browser.getContext();
        NetworkService networkService = browserContext.getNetworkService();
        networkService.setNetworkDelegate(new DefaultNetworkDelegate() {
            @Override
            public void onBeforeURLRequest(BeforeURLRequestParams params) {
                if ("POST".equals(params.getMethod())) {
                    UploadData uploadData = params.getUploadData();
                    UploadDataType dataType = uploadData.getType();
                    if (dataType == UploadDataType.FORM_URL_ENCODED) {
                        FormData data = (FormData) uploadData;
                        data.setPair("key1", "value1", "value2");
                        data.setPair("key2", "value2");
                    } else if (dataType == UploadDataType.MULTIPART_FORM_DATA) {
                        MultipartFormData data = (MultipartFormData) uploadData;
                        data.setPair("key1", "value1", "value2");
                        data.setPair("key2", "value2");
                        data.setFilePair("file3", "C:\\Test.zip");
                    } else if (dataType == UploadDataType.PLAIN_TEXT) {
                        TextData data = (TextData) uploadData;
                        data.setText("My data");
                    } else if (dataType == UploadDataType.BYTES) {
                        BytesData data = (BytesData) uploadData;
                        data.setData("My data".getBytes());
                    }
                    // Apply modified upload data that will be sent to a web server.
                    params.setUploadData(uploadData);
                }
            }
        });
        browser.loadURL(new LoadURLParams("http://localhost/", "key=value"));
    }
}

这是输出:

public static int findNumPath(int row, int col){
int total = 0;

//if grid[2][2] is reached, 1 path is found
if(row == 2 && col == 2){
    return 1;
}
grid[row][col] = true;
print();

if(col < 2 && grid[row][col+1] == false){
    System.out.println("inside 1st if" + " ,total= " + total);
    total = total + findNumPath(row, col+1);
}
if(col > 0 && grid[row][col-1] == false){
    System.out.println("inside 2nd if" + " ,total= " + total);
    total = total + findNumPath(row, col-1);
}
if(row < 2 && grid[row+1][col] == false){
    System.out.println("inside 3rd if" + " ,total= " + total);
    total = total + findNumPath(row+1, col);
}
if(row > 0 && grid[row-1][col] == false ){
    System.out.println("inside 4th if"+ " ,total= " + total);
    total = total + findNumPath(row-1, col);
}

grid[row][col] = false;
System.out.println("after making false" + " total=" + total);
return total;
}

我最近了解了回溯,我试图理解这个代码回溯如何运作,但是我不明白在我们找到第一条路径之后发生了什么,程序如何知道回去做一些TRUE为假:

true false false 
false false false 
false false false 

inside 1st if ,total= 0
true true false 
false false false 
false false false 

inside 1st if ,total= 0
true true true 
false false false 
false false false 

inside 3rd if ,total= 0
true true true 
false false true 
false false false 

inside 2nd if ,total= 0
true true true 
false true true 
false false false 

inside 2nd if ,total= 0
true true true 
true true true 
false false false 

inside 3rd if ,total= 0
true true true 
true true true 
true false false 

inside 1st if ,total= 0
true true true 
true true true 
true true false 

inside 1st if ,total= 0
after making false total=1
after making false total=1
after making false total=1
inside 3rd if ,total= 1
true true true 
false true true 
false true false 

inside 1st if ,total= 0
inside 2nd if ,total= 1
true true true 
false true true 
true true false 

inside 4th if ,total= 0
true true true 
true true true 
true true false 

after making false total=0
after making false total=0
after making false total=1
after making false total=2
inside 3rd if ,total= 2
after making false total=3
after making false total=3
inside 3rd if ,total= 3
true true false 
false true false 
false false false 

inside 1st if ,total= 0
true true false 
false true true 
false false false 

inside 3rd if ,total= 0
inside 4th if ,total= 1
true true true 
false true true 
false false false 

after making false total=0
after making false total=1
inside 2nd if ,total= 1
true true false 
true true false 
false false false 

inside 3rd if ,total= 0
true true false 
true true false 
true false false 

inside 1st if ,total= 0
true true false 
true true false 
true true false 

inside 1st if ,total= 0
after making false total=1
after making false total=1
after making false total=1
inside 3rd if ,total= 2
true true false 
false true false 
false true false 

inside 1st if ,total= 0
inside 2nd if ,total= 1
true true false 
false true false 
true true false 

inside 4th if ,total= 0
true true false 
true true false 
true true false 

after making false total=0
after making false total=0
after making false total=1
after making false total=3
after making false total=6
inside 3rd if ,total= 6
true false false 
true false false 
false false false 

inside 1st if ,total= 0
true false false 
true true false 
false false false 

inside 1st if ,total= 0
true false false 
true true true 
false false false 

inside 3rd if ,total= 0
inside 4th if ,total= 1
true false true 
true true true 
false false false 

inside 2nd if ,total= 0
true true true 
true true true 
false false false 

after making false total=0
after making false total=0
after making false total=1
inside 3rd if ,total= 1
true false false 
true true false 
false true false 

inside 1st if ,total= 0
inside 2nd if ,total= 1
true false false 
true true false 
true true false 

after making false total=0
after making false total=1
inside 4th if ,total= 2
true true false 
true true false 
false false false 

inside 1st if ,total= 0
true true true 
true true false 
false false false 

inside 3rd if ,total= 0
true true true 
true true true 
false false false 

inside 3rd if ,total= 0
after making false total=1
after making false total=1
after making false total=1
after making false total=3
inside 3rd if ,total= 3
true false false 
true false false 
true false false 

inside 1st if ,total= 0
true false false 
true false false 
true true false 

inside 1st if ,total= 0
inside 4th if ,total= 1
true false false 
true true false 
true true false 

inside 1st if ,total= 0
true false false 
true true true 
true true false 

inside 3rd if ,total= 0
inside 4th if ,total= 1
true false true 
true true true 
true true false 

inside 2nd if ,total= 0
true true true 
true true true 
true true false 

after making false total=0
after making false total=0
after making false total=1
inside 4th if ,total= 1
true true false 
true true false 
true true false 

inside 1st if ,total= 0
true true true 
true true false 
true true false 

inside 3rd if ,total= 0
true true true 
true true true 
true true false 

inside 3rd if ,total= 0
after making false total=1
after making false total=1
after making false total=1
after making false total=2
after making false total=3
after making false total=3
after making false total=6
after making false total=12
12

非常感谢您的解释,以帮助我理解。

1 个答案:

答案 0 :(得分:1)

上面的代码并不是真正的回溯,而是一种递归搜索算法。它以递归方式搜索您的网格,按此顺序移动深度优先,左,右,下,上。

当它移动到 true 时,它标记了一个字段,当它耗尽了该位置的所有可能性时(对于当前访问的字段),用 false 标记它。它标记了字段,因为它不会重新访问字段两次,因此它会搜索最多访问每个字段一次的路径。

请注意,它会针对通往该字段的每条路径再次评估字段。

相关问题