数独游戏
package dfs;
import java.util.Scanner;
public class dfs数独 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[][] table = new char[9][9];
for(int i=0;i<9;i++) {
table[i] = sc.nextLine().toCharArray();
}
dfs(table,0,0);
}
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 k=1;k<10;k++) {
if(check(table,x,y,k)) {
table[x][y]=(char)('0'+k);
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 boolean check(char[][] table,int i,int j,int k) {
//检查同行同列
for(int l=0;l<9;l++) {
if(table[i][l]==(char)('0'+k)) return false;
if(table[l][j]==(char)('0'+k)) return false;
}
//检查小九宫格
for(int l=(i/3)*3;l<(i/3+1)*3;l++) {
for(int m=(j/3)*3;m<(j/3+1)*3;m++) {
if(table[l][m]==(char)('0'+k)) return false;
}
}
return true;
}
private static void print(char[][] table) {
for(int i=0;i<9;i++) {
System.out.println(new String(table[i]));
}
}
}
部分和
package dfs;
import java.util.ArrayList;
import java.util.Scanner;
public class dfs部分和 {
private static int b;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n =sc.nextInt();
int[] a = new int[n];
for(int i=0;i<n;i++) {
a[i] = sc.nextInt();
}
int k = sc.nextInt();
b = k;
dfs(a,k,0,new ArrayList<Integer>());
}
private static void dfs(int[] a,int k,int cur,ArrayList<Integer> ints) {
if(k==0) {
System.out.print("Yes ("+ b +" = ");
int size = ints.size();
for(int i=0;i<size;i++) {
System.out.print(ints.get(i)+(i==size-1?"":" + "));
}
System.out.print(")");
System.exit(0);
}
if(k<0||cur==a.length) return;
dfs(a,k,cur+1,ints);//不要cur这个元素
ints.add(a[cur]);
int index = ints.size()-1;
dfs(a,k-a[cur],cur+1,ints);
ints.remove(index);//回溯
}
}
皇后问题
package dfs;
public class dfs皇后 {
private static int n;
private static int cnt;
private static int[] rec;
public static void main(String[] args) {
n=4;
rec = new int[4];
dfs(0);
System.out.println(cnt);
}
private static void dfs(int row) {//row代表行
if(row==n) {
cnt++;
return;
}
//依次尝试在某列上放置一个皇后
for(int col=0;col<n;col++) {//col代表列
boolean check = true;
//检测这个皇后和之前放置的有没有冲突
for(int i=0;i<row;i++) {
if(rec[i]==col||i+rec[i]==row+col||rec[i]-i==col-row) {
check=false;
break;
}
}
if(check) {
rec[row]=col;//标记
dfs(row+1);//继续找下一行
rec[row]=0;//回溯
}
}
}
}
素数环
package dfs;
import java.util.Scanner;
public class dfs素数环 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] rec = new int[n];
rec[0]=1;
dfs(n,rec,1);
}
private static void dfs(int n,int[] rec,int cur) {
if(cur==n&&isP(rec[0]+rec[n-1])) {
print(rec);
return;
}
for(int i=2;i<=n;i++) {
if(check(rec,i,cur)) {
rec[cur]=i;
dfs(n,rec,cur+1);
rec[cur]=0;
}
}
}
private static boolean check(int[] rec,int i,int cur) {
for(int e:rec) {
if(e==i||!isP(rec[cur-1]+i)) {
return false;
}
}
return true;
}
private static void print(int[] rec) {
for(int i=0;i<rec.length;i++) {
System.out.print(rec[i]+(i==rec.length-1?"":" "));
}
System.out.println();
}
private static boolean isP(int k) {
for(int i=2;i*i<=k;i++) {
if(k%i==0) {
return false;
}
}
return true;
}
}
大致模板
public static void main(String[] args){
int 一些数;
int[] rec = new int[?];//建立辅助数组
rec[0]=? //从某一个数开始
dfs();
}
private static void dfs(){
if(){
终结;
输出;
return;
}
for(int from ? to ?){
if(check()){
记录;
dfs(下一位);
回溯;
}
}
}
private static void check(){
}