深度优先搜索DFS

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值