DFS先把一条路走到黑 BFS所有路口看一遍(借助队列)
1.数独游戏
填字保证每一行每一列的数字都是1-9
只有y=8的时候,除法才能=1,此时x++
dfs(table,x,y){
if(x==9){
print(table);
System.exit(0);
}
if(table[x][y]=='0'){
//选1-9之间合法的数字填到x, y这个位置
for(i=1..9){
boolean res = check(table,x,y,i);
//检查所在的小九宫格没有数字
if(res){
table[x][y]=i;//填上,转移到下一个状态
dfs(table,x+(y+1)/9,(y+1)%9);
}
}
table[x][y]='0';//回溯,退回到原来的状态
}else{
//继续找下一个需要处理的位置
dfs(table,x+(y+1)/9,(y+1)%9);
}
}
2.部分和
给定整数序列a1,a2,... an,判断是否可以从中选出若干数,使它们的和恰好为k
样例:
输入:
n=4
a={1,2,4,7}
k=13
输出:
Yes (13=2+4+7)
【算法】可以用子集的二进制方法,对于每个元素要或者不要
【DFS算法】
3.水洼数
有一个大小为NxM的园子,雨后积起了水。八连通的积水被认为是连接在一 起的。请求出
园子里总共有多少水洼? (八连通指的是下图中相对W的*的部分)
***
*W*
***
输入
N=10,M=12
园子如下图('W'表示积水,'. '表示没有积水)
【算法】为了防止重复找到一个有水的地方就将水抽干
剪枝:深搜时,如已明确从当前状态无论如何转移都不会存在(更优)解,就应该中
断往下的继续搜索。
-数独里面有剪枝
-部分和里面有剪枝
4.n皇后问题
在一个n*n的棋盘上放置n个棋子,使得每行每列和每条对角线上都只有一个棋子, 求其摆放的方法数。
【算法】用一维数组rec就可以存,用下标表示行,用值表示列。对角线上的元素x-y相同x+y相同
5.素数环
输入正整数n,对1-n进行排列, 使得相邻两个数之和均为素数,输出时从整数1开始,逆时针排列。同一个环应恰好输出一次。
5.困难的串
如果一个字符串包含两个相邻的重复子串,则称它为容易的串,其他串称为困难的串
如:BB, ABCDACABCAB, ABCDABCD都是容易的,D, DC, ABDAB, CBABCBA都是因难的。输入正整数n,L,输出由前L个字符(大写英文字母)组成的,字典序第n小的困难的串
例如,当L=3时, 前7个困难的串分别为:
A, AB, ABA,ABAC, ABACA, ABACAB, ABACABA
n指定为4的话,输出ABAC