以下是在网格上移动的机器人的代码,该网格假设从左上角移动到右下角并找到到达右下方的独特方式:
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
非常感谢您的解释,以帮助我理解。
答案 0 :(得分:1)
上面的代码并不是真正的回溯,而是一种递归搜索算法。它以递归方式搜索您的网格,按此顺序移动深度优先,左,右,下,上。
当它移动到 true 时,它标记了一个字段,当它耗尽了该位置的所有可能性时(对于当前访问的字段),用 false 标记它。它标记了字段,因为它不会重新访问字段两次,因此它会搜索最多访问每个字段一次的路径。
请注意,它会针对通往该字段的每条路径再次评估字段。