最近在准备第十二届蓝桥杯国赛,上一次国赛因为知识面狭窄很多算法都写不出。今年学习数据结构后有一些提升,虽然今年中心不在比赛,但是也希望能得个三等奖就知足了。
其实蓝桥杯并不算难,里面很多算法都是死的,对于省赛来说,基本不需要算法知识就能得奖,但是对于国赛,省赛像一把削皮刀剔除一些编程能力相对弱一些的选手。
废话不多说,之前一致想把BFS和DFS搞懂,但是被各种事情左右,一直没来的及。这次通过国赛复习用几个形象的例子来进行记忆
主要用到BFS的回溯算法
代码如下:
public class Test {
public static void main(String[] args) {
int[][] map = new int[10][10];
init_map(map);
print_map(map);
bfs(map, 1, 1);
print_map(map);
}
private static boolean bfs(int[][] map, int i, int j) {
if (map[8][8] == 2) {
return true;
} else {
if (map[i][j] == 0) {
map[i][j] = 2;
//此处先后顺序与方向顺序有关
if (bfs(map, i+1, j)) return true;
else if (bfs(map, i, j + 1)) return true;
else if (bfs(map, i - 1, j)) return true;
else if (bfs(map, i, j - 1)) return true;
else
map[i][j] = 3;
} else {
return false;
}
}
return false;
}
private static void print_map(int[][] map) {
System.out.println("------------------Map----------------");
for (int[] ap : map) {
for (int a : ap) {
if (a != 2)
System.out.print(a + "\t");
else
System.out.print("#\t");
}
System.out.println();
}
System.out.println("-------------------------------------");
}
private static void init_map(int[][] map) {
for (int i = 0; i < map.length; i++) {
map[i][0] = 1;
map[i][map.length - 1] = 1;
}
for (int i = 0; i < map.length; i++) {
map[0][i] = 1;
map[map[i].length - 1][i] = 1;
}
//创建障碍
for (int i = 9; i > 3; i--) {
map[2][i] = 1;
}
for (int i = 0; i < 8; i++) {
map[4][i] = 1;
map[6][i] = 1;
}
}
}
运行结果:
又测试了几次,代码并不完美,有空再改进
完美,太完美了,打造知识架构3.0!高旭yyds!