算法面试之回溯法

来源:互联网 发布:淘宝卖假货没人管吗 编辑:程序博客网 时间:2024/05/21 02:49

回溯法是一种暴力查找法,适合于探索路径,探索每一步的走法。如果符合就走下去,不符合就回溯,然后再去寻找。通过这点就能分辨出一道题是不是在考你回溯法。

看我博客的人请注意,我写的不规范,这是方便自己理解,代码是不能运行的,有疑问请加qq:823071447  备注:回溯法

算法框架.

int n =0;

void backtrack(int n){

if(n=aim)

           print "这是一个成功路径"

      else{

         for(int i=0;i<aim;i++){

          if (is_ok(n,i))

                backtrack(n+1)

}

}         

}


面试题1:八皇后问题

int row=0;

int aim=8;

void backtrack(int n){

    if(row==aim)

       print "这是一个成功路径"

    else{

       for(int i=0;i<colums;i++){

            if(is_ok(row,i)){

              backtrack(row+1)             

}

}

}

}

面试题2:字母打印问题(剑指offer)

import java.util.ArrayList;
import java.util.Collections;

public class Solution {
ArrayList<String> list = new ArrayList<String>();

int j =0;
public ArrayList<String> Permutation(String str) {
if (str != null && str.length() > 0) {
change(str.toCharArray(), 0);
Collections.sort(list);
}
for (String st : list) {
System.out.println(st);
}
return list;
}


public void change(char[] str_ch,int i){
if(i == str_ch.length - 1) {
String val = String.valueOf(str_ch);
if (!list.contains(val))
list.add(val);
}
else{
for(int j=i;j<str_ch.length;j++){
swap(str_ch,i,j);
change(str_ch,i+1);
swap(str_ch,i,j);
}
}
}
private void swap(char[] cs, int i, int j2) {
// TODO Auto-generated method stub
char temp = 0;
temp = cs[i];
cs[i] = cs[j2];
cs[j2] = temp;
}
public static void main(String[] args){
Solution test = new Solution();
test.Permutation("abcd");
}
}

import java.util.ArrayList;
import java.util.Collections;

public class Solution {
ArrayList<String> list = new ArrayList<String>();

int j =0;
public ArrayList<String> Permutation(String str) {
if (str != null && str.length() > 0) {
change(str.toCharArray(), 0);
Collections.sort(list);
}
for (String st : list) {
System.out.println(st);
}
return list;
}


public void change(char[] str_ch,int i){
if(i == str_ch.length - 1) {
String val = String.valueOf(str_ch);
if (!list.contains(val))
list.add(val);
}
else{
for(int j=i;j<str_ch.length;j++){
swap(str_ch,i,j);
change(str_ch,i+1);
swap(str_ch,i,j);
}
}
}
private void swap(char[] cs, int i, int j2) {
// TODO Auto-generated method stub
char temp = 0;
temp = cs[i];
cs[i] = cs[j2];
cs[j2] = temp;
}
public static void main(String[] args){
Solution test = new Solution();
test.Permutation("abcd");
}
}

这个问题与上一题不同,但同样的寻路的问题,如果不行,就换一种方法。

原创粉丝点击