常见应用案例
如[一三年蓝桥杯省赛Java组真题](
)“剪格子”就是采用典型的回溯法思想:
package 一三年省赛真题;
import java.util.Scanner;
public class Year2013_t10 {
static int[][] g;
static int[][] sign;
static int m;
static int n;
static int s=0; //记录格子中元素的总和
static int answer = Integer.MAX_VALUE; //最终格子数
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
m = scanner.nextInt(); //输入格子的宽
n = scanner.nextInt(); //输入格子的高
g = new int[n][m];
sign = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
g[i][j] = scanner.nextInt(); //为格子赋值
s+=g[i][j];
}
}
move(0, 0, 0, 0);
System.out.println(answer);
}
/**
* 记录格子的遍历过程
* @param i 移动的横坐标
* @param j 移动的纵坐标
* @param step 步数
* @param sum 格子中元素的总和
* */
public static void move(int i,int j,int step,int sum) {
//如果该格子坐标不在范围内,或该格子已经走过,则返回
if (i==n||i<0||j<0||j==m||sign[i][j]==1) {
return;
}
// 如果当前数值和是总和的一半
if (sum*2==s) {
answer = Math.min(answer, step); //对格子数(步数)与符合要求的格子数比较,取出最小值
}
sign[i][j] = 1; //对走过的格子进行标记,表示格子已经走过
move(i+1, j, step+1, sum+g[i][j]); //down