Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
Exhaustive Search and Backtracking
Hao Jiang
Computer Science Department
1
Exhaustive Search
Modern computers can compute millions of times per
second.
Exhaustive search is possible for some small scale
problems.
We study some systematic way to write such
programs.
2
An Example
Combination:
Given a set {1, 2, 3, 4, 5}, how many subsets does it have?
{}
{1}, {2}, {3}, …
{1,2},{1,3}, …
{1,2,3}, …
…
{1,2,3,4,5}
3
The Java Code
public class MyCombine {
public static void all_sub_string(int[] a, int n)
{
if (n == a.length)
{
for (int i = 0; i < a.length; i++)
System.out.print( a[i] + " ");
System.out.println();
return;
}
a[n] = 0;
all_sub_string(a, n+1);
a[n] = 1;
all_sub_string(a, n+1);
}
public static void main(String[] s)
{
int[] a = new int[3];
all_sub_string(a, 0);
}
}
4
Backtracking
backtrack(A, k)
if A={a[1], a[2], a[3], … a[k]} is a solution
report it
else
compute candidate set S(k)
foreach c in S(k)
a[k] = c
backtrack(A, k+1)
5
Permutation
public class MyPermute {
public static void all_perm(int[] a, int n)
{
if (n == a.length)
{
for (int i = 0; i < a.length; i++)
System.out.print( a[i] + " ");
System.out.println();
return;
}
public static void main(String[] s)
{
int[] a = new int[4];
all_perm(a, 0);
}
}
int[] v = new int[a.length];
for (int i = 0; i < n; i++)
v[a[i]] = 1;
for (int i = 0; i < a.length; i++)
{
if (v[i] == 0)
{
a[n] = i;
all_perm(a, n+1);
}
}
}
6
Splitting Money
How many ways can we split n dollars into 25 cents,
10 cents, 5 cents and 1 cents.
7
The Code
public class Money {
public static void all(int[] a, int n, int m)
{
if (n < 0)
return;
if (n == 0 )
{
for (int i = 0; i < m; i++)
System.out.print(a[i] + " ");
System.out.println();
return;
}
int[] b = {25, 10, 5, 1};
for (int i = 0; i < b.length; i++)
{ a[m] = b[i];
all(a, n-b[i], m+1);
}
}
public static void main(String[] s)
{
int[] a = new int[1000];
all(a, 30, 0);
}
}
8
Robot Path
Start point
destination
How many paths do we have?
9
The Code
public class MyPath {
public static void all_path(int[][] a, int r, int c, int N)
{
if (r == N-1 && c == N-1)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
System.out.print( a[i][j] + " ");
System.out.println();
}
System.out.println();
return;
}
if (r < N-1)
{
a[r+1][c] = 1;
all_path(a, r+1, c, N);
a[r+1][c] = 0;
}
if (c < N-1)
{
a[r][c+1] = 1;
all_path(a, r, c+1, N);
a[r][c+1] = 0;
}
}
public static void main(String[] s)
{
int[][] a = new int[5][5];
a[0][0] = 1;
all_path(a, 0, 0, 5);
}
}
10
Eight Queen
11
Public class EightQ {
public static void all_q(int[] a, int n)
{
if (n == a.length)
{
for (int i = 0; i < a.length; i++)
{
for (int j = 0; j < a.length; j++)
{
if (a[i] == j)
System.out.print("Q ");
else
System.out.print("+ ");
}
System.out.println();
}
System.out.println();
return;
}
for (int i = 0; i < a.length; i++)
{
boolean isAvail = true;
for (int j = 0; j < n; j++)
{
if (a[j] == i)
isAvail = false;
if (i-a[j] == n-j)
isAvail = false;
if (a[j]-i == n-j)
isAvail = false;
}
The Code
if (isAvail)
{
a[n] = i;
all_q(a, n+1);
}
}
}
public static void main(String[] s)
{
int[] a = new int[8];
all_q(a, 0);
}
}
12
Backtracking and DFS
Backtracking is essentially depth first search.
Backtracking searches and builds up the tree at the
same time.
…
13
More Puzzles
Sodoku
15-puzzle
Can you write a backtrack program to solve the puzzles?
14