DFS-排列数字和n皇后-java实现
DFS
排列数字
思路
很简单直接背模板,从下标0开始dfs,如果下标u=排列数量直接输出path,否则,从1-n看每个数字是否用过st数组,没用过,就让当前下标位置为for的数字path[u]=i,标记用过st[i]=true,dfs下一个位置dfs(u+1),回溯的时候令st[i]=false
代码
import java.util.Scanner ;
public class Main{static int[] path = new int[10];static int n;static boolean[] st = new boolean [10];public static void dfs(int u){if(u==n){for(int i=0;i<n;i++){System.out.printf("%d ",path[i]);}System.out.printf("%n");return;}else{for(int i=1;i<=n;i++){if(!st[i]){path[u] = i;st[i]=true;dfs(u+1);st[i]=false;}}}}public static void main(String[] args){Scanner scan = new Scanner(System.in);n = scan.nextInt();dfs(0);}
}
n皇后
思路:
两种方法,第一种按全排列的思路走一遍,不过判断的地方改成没有同一列,对角线,反对角线冲突这样,思路更简单,推荐记

代码1
import java.util.Scanner ;
public class Main{static char[][] g = new char[20][20];static int n;static boolean[] col = new boolean [20];static boolean[] dg = new boolean [20];static boolean[] udg = new boolean [20];public static void dfs(int u){if(u==n){for(int i=0;i<n;i++){for(int j=0;j<n;j++){System.out.printf("%c",g[i][j]);}System.out.printf("\n");}System.out.printf("\n");return;}else{for(int i=0;i<n;i++){//这是列数if(!col[i] &&!dg[i+u] &&!udg[i-u+n]){g[u][i]='Q';col[i]=dg[i+u]=udg[i-u+n]=true;dfs(u+1);col[i]=dg[i+u]=udg[i-u+n]=false;g[u][i]='.';}}}}public static void main(String[] args){Scanner scan = new Scanner(System.in);n = scan.nextInt();for(int i=0;i<n;i++){for(int j=0;j<n;j++)g[i][j]='.';}dfs(0);//这是行数}
}
思路2
更原始的写法,每个位置判断放不放皇后
代码2
import java.util.Scanner ;
public class Main{static char[][] g = new char[20][20];static int n;static boolean[] col = new boolean [20];static boolean[] row = new boolean [20];static boolean[] dg = new boolean [20];static boolean[] udg = new boolean [20];public static void dfs(int x, int y, int s){//x是行 y是列if(y==n){y=0;x=x+1;//换行}if(x==n){//最后一行判断皇后放完了吗if(s==n){for(int i=0;i<n;i++){for(int j=0;j<n;j++){System.out.printf("%c",g[i][j]);}System.out.printf("\n");}System.out.printf("\n");}return ;}//分放皇后和不放皇后两种情况dfs(x,y+1,s);//不放//放皇后需要不冲突if(!row[x]&&!col[y]&&!dg[x+y]&&!udg[x-y+n]){g[x][y]='Q';row[x]=col[y]=dg[x+y]=udg[x-y+n]=true;dfs(x,y+1,s+1);//放皇后s+1\row[x]=col[y]=dg[x+y]=udg[x-y+n]=false;g[x][y]='.';}}public static void main(String[] args){Scanner scan = new Scanner(System.in);n = scan.nextInt();for(int i=0;i<n;i++){for(int j=0;j<n;j++)g[i][j]='.';}dfs(0,0,0);//x,y,皇后}
}
