dfs基本概念
what ?
: 深搜是从某一状态开始,不断的转移状态直到无法转移,然后回退到前一个状态,继续转移到其他状态,如此不断的重复,直到得到最终解; 一般dfs与递归结合解题。
回溯
:递归调用代表开启一个分支,如果希望这个分支返回后某些数据恢复到分支前的状态以便重新开始
,就要用回溯技巧。
剪枝
:dfs时,如果已明确从当前状态无论如何转移都不会存在(更优)解,就应该中断往下继续搜索
,称为剪枝。
例子
数独
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
char [][]table = new char[9][];
int x=0,y=0;
Scanner scanner = new Scanner(System.in);
for(int i=0;i<9;i++)
table[i] = scanner.nextLine().toCharArray();
dfs(table,x,y);
}
private static void dfs(char[][] table, int x, int y) {
if(x == 9){
print(table);
System.exit(0); //退出
}
if(table[x][y] == '0'){
for(int i = 1;i < 10;i++){
boolean res = check(table,x,y,i);
if(res == true){
table[x][y] = (char) ('0'+ i);
dfs(table,x+(y+1)/9,(y+1)%9); //转移状态
}
}
table[x][y] = '0';//回溯
}
else{
dfs(table,x+(y+1)/9,(y+1)%9);
}
}
private static void print(char[][] table) {
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
System.out.print(table[i][j]);
}
System.out.println()