packagep4.分治回溯;publicclassRecursionDemo02{publicstaticvoidmain(String[] args){int ret =f(100);System.out.println(ret);}privatestaticintf(int n){if(n ==1){return1;}returnf(n -1)+ n;}}
斐波那契数列
packagep4.分治回溯;publicclassRecursionDemo03{publicstaticvoidmain(String[] args){int ret =f(50);System.out.println(ret);}privatestaticintf(int x){if(x ==1|| x ==2){return1;}returnf(x -1)+f(x -2);}}
packagep4.分治回溯;importjava.util.Scanner;//棋盘覆盖问题publicclassChessBoardCoverage{privatestaticint BOARD_SIZE =8;privatestaticint[][] board =newint[BOARD_SIZE][BOARD_SIZE];//代表颜色 同一组L骨牌 编号应该是一样的privatestaticint title =0;// 0就是特殊方格的存在publicstaticvoidmain(String[] args){Scanner input =newScanner(System.in);System.out.print(">>>请输入特殊方格的角标信息:");//dr dc 指的是特殊方格的坐标int dr = input.nextInt();int dc = input.nextInt();chessBoard(0,0, dr, dc,BOARD_SIZE);printBoard();}privatestaticvoidprintBoard(){for(int i =0; i < BOARD_SIZE; i++){for(int j =0; j < BOARD_SIZE; j++){System.out.print(board[i][j]+"\t");}System.out.println();}}//在size*size的矩阵中 以tr tc为四部分子矩阵的基点 dr dc是特殊矩阵的位置 进行填充privatestaticvoidchessBoard(int tr,int tc,int dr,int dc,int size){//判断递归结束 如果尺寸为1 则不可继续拆分 则返回 归if(size ==1){return;}//该层要填充L型骨牌 编号是一致的int num =++title;//该层要继续分四个部分 每个部分的尺寸是多少int s = size /2;//判断特殊方格在四个部分中 那个部分里//左上if(dr < tr + s && dc < tc + s){chessBoard(tr,tc,dr,dc,s);}else{
board[tr + s -1][tc + s -1]= num;chessBoard(tr,tc,tr + s -1,tc + s -1,s);}//右上if(dr < tr + s && dc >= tc + s){chessBoard(tr,tc + s,dr,dc,s);}else{
board[tr + s -1][tc + s]= num;chessBoard(tr,tc + s,tr + s -1,tc + s,s);}//左下if(dr >= tr + s && dc < tc + s){chessBoard(tr + s,tc,dr,dc,s);}else{
board[tr + s][tc + s -1]= num;chessBoard(tr + s,tc,tr + s,tc + s -1,s);}//右下if(dr >= tr + s && dc >= tc + s){chessBoard(tr + s,tc + s,dr,dc,s);}else{
board[tr + s][tc + s]= num;chessBoard(tr + s,tc + s,tr + s,tc + s,s);}}}
全排列
packagep4.分治回溯;importjava.util.HashSet;//全排列publicclassFullPermutation{publicstaticvoidmain(String[] args){String s ="ABB";char[] arr = s.toCharArray();HashSet<String> set =newHashSet<>();permutation(set, arr,0, arr.length -1);System.out.println(set);}privatestaticvoidpermutation(HashSet<String> set,char[] arr,int from,intto){if(from ==to){
set.add(String.valueOf(arr));//[A,B,C] => "ABC"}else{for(int i = from; i <=to; i++){swap(arr, i, from);permutation(set, arr, from +1,to);swap(arr, i, from);}}}privatestaticvoidswap(char[] arr,int i,int j){char temp = arr[i];
arr[i]= arr[j];
arr[j]= temp;}}
迷宫
packagep4.分治回溯;importp3.链式结构.LinkedList;publicclassMaze{privatestaticint[][] maze ={{1,1,1,1,1,1,1,1,1},{0,0,1,0,0,0,1,1,1},{1,0,1,1,1,0,1,1,1},{1,0,0,1,0,0,1,1,1},{1,1,0,1,1,0,0,0,1},{1,0,0,0,0,0,1,0,1},{1,0,1,1,1,0,0,0,1},{1,1,0,0,0,0,1,0,0},{1,1,1,1,1,1,1,1,1}};//入口信息privatestaticint entryX =1;privatestaticint entryY =0;//出口信息privatestaticint exitX =7;privatestaticint exitY =8;//路径访问状态表privatestaticboolean[][] vistied =newboolean[9][9];//方向的变化量privatestaticint[][] direction ={{1,0},{0,1},{0,-1},{-1,0}};//存储路径的栈privatestaticLinkedList<String> stack =newLinkedList<>();publicstaticvoidmain(String[] args){boolean flag =go(entryX, entryY);if(flag){for(String path : stack){System.out.println(path);}}else{System.out.println("迷宫不通!");}}//以x,y为入口 看是否能够向下找到出口 返回false找不到privatestaticbooleango(int x,int y){
stack.push("("+ x +","+ y +")");
vistied[x][y]=true;if(x == exitX && y == exitY){returntrue;}//考虑四个方向 上 右 下 左for(int i =0; i < direction.length; i++){int newX = direction[i][0]+ x;int newY = direction[i][1]+ y;if(isInArea(newX, newY)&&isRoad(newX, newY)&&!vistied[newX][newY]){if(go(newX, newY)){returntrue;//某一个方向能通 则向上返回true 表示此层次x y能通}}}
stack.pop();returnfalse;//四个方向都不通 则向上返回false 表示此次层x y 不通}privatestaticbooleanisRoad(int x,int y){return maze[x][y]==0;}privatestaticbooleanisInArea(int x,int y){return x >=0&& x < 9 && y >=0&& y <9;}}
汉诺塔
packagep4.分治回溯;//已知既定规律的问题//未知既定规律的问题publicclassHanoi{publicstaticvoidmain(String[] args){String x ="X";String y ="Y";String z ="Z";hanoi(3,x,y,z);}privatestaticvoidhanoi(int n,String begin,String mid,String end){if(n ==1){System.out.println(begin +"->"+ end);}else{hanoi(n -1,begin, end, mid);System.out.println(begin +"->"+ end);hanoi(n -1,mid, begin, end);}}}
N皇后
packagep4.分治回溯;//N皇后问题publicclassNQueen{privatestaticint count =0;//记录解的个数privatestaticfinalintN=8;//N皇后 矩阵的尺寸privatestaticint[][] arr =newint[N][N];//棋盘数据 0表示空 1表示皇后publicstaticvoidmain(String[] args){queen(0);}//递归的解决row角标行 皇后的问题 如果row == N 说明一个解就出来了privatestaticvoidqueen(int row){if(row ==N){
count++;System.out.println("第"+ count +"个解:");printArr();}else{//遍历当前行的列for(int col =0; col <N; col++){if(!isDangerous(row, col)){//每次要放置皇后的时候 都先对该行进行清空for(int c =0; c <N; c++){
arr[row][c]=0;}
arr[row][col]=1;queen(row +1);}}}}privatestaticbooleanisDangerous(int row,int col){//向上for(int r = row -1; r >=0; r--){if(arr[r][col]==1){returntrue;}}//左上for(int r = row -1, c = col -1; r >=0&& c >=0; r--, c--){if(arr[r][c]==1){returntrue;}}//右上for(int r = row -1, c = col +1; r >=0&& c <N; r--, c++){if(arr[r][c]==1){returntrue;}}returnfalse;}privatestaticvoidprintArr(){for(int i =0; i <N; i++){for(int j =0; j <N; j++){System.out.print(arr[i][j]+" ");}System.out.println();}}}
数独
packagep4.分治回溯;importjava.io.*;//数独publicclassSudoku{privatestaticint i =0;privatestaticint[][] board =newint[9][9];publicstaticvoidmain(String[] args)throwsIOException{readFile("sudoku_data_01.txt");solve(0,0);}//求解x-y格子的解 再继续向下递归求解下一个格子//本质求多个解 但实际 数独问题只能有一个解 如果没解 程序啥也不输出!privatestaticvoidsolve(int row,int col){if(row ==9){
i++;System.out.println("==========="+ i +"==========");printBoard();//System.exit(0);}else{if(board[row][col]==0){//需要填数字1~9for(int num =1; num <=9; num++){if(!isExist(row, col, num)){
board[row][col]= num;//8//解决下一个格子solve(row +(col +1)/9,(col +1)%9);}//如果此处没解 必须清零
board[row][col]=0;}}else{//已经存在一个已知数字 直接跳过去解决下一个格子solve(row +(col +1)/9,(col +1)%9);}}}privatestaticbooleanisExist(int row,int col,int num){//同行for(int c =0; c <9; c++){if(board[row][c]== num){returntrue;}}//同列for(int r =0; r <9; r++){if(board[r][col]== num){returntrue;}}//同九宫 3*3int rowMin =0;int colMin =0;int rowMax =0;int colMax =0;if(row >=0&& row <=2){
rowMin =0;
rowMax =2;}if(row >=3&& row <=5){
rowMin =3;
rowMax =5;}if(row >=6&& row <=8){
rowMin =6;
rowMax =8;}if(col >=0&& col <=2){
colMin =0;
colMax =2;}if(col >=3&& col <=5){
colMin =3;
colMax =5;}if(col >=6&& col <=8){
colMin =6;
colMax =8;}for(int r = rowMin; r <= rowMax; r++){for(int c = colMin; c <= colMax; c++){if(board[r][c]== num){returntrue;}}}returnfalse;}privatestaticvoidreadFile(String fileName)throwsIOException{File file =newFile(fileName);FileReader fr =newFileReader(file);BufferedReader br =newBufferedReader(fr);String line =null;int row =0;while((line = br.readLine())!=null){for(int col =0; col <9; col++){
board[row][col]=Integer.parseInt(line.charAt(col)+"");}
row++;}}privatestaticvoidprintBoard(){for(int i =0; i <9; i++){for(int j =0; j <9; j++){System.out.print(board[i][j]+" ");}System.out.println();}}}