算法---深度优先搜索

来源:互联网 发布:怎么减少网络延迟 编辑:程序博客网 时间:2024/06/11 07:11

搜索的基本框架:

void dfs(int step) {    //判断结束条件    //尝试每一种可能    for(::) {        //继续下一步        dfs(step+1);        //收回    }    //返回}

以四位全排列(1234组成的所有组合)为例:

#include<stdio.h>int n,a[10],book[10];void dfs(int step) {    int i;     //判断结束条件(当step到了n+1的时候结束)    if(step == n+1) {        for(i=1; i<=n; i++) {            printf("%d", a[i]);        }           printf("\n");    }    //遍历所有可能     for(i=1; i<=n; i++) {        //判断i是否已经走了         if(book[i] == 0) {            //i还没走就放进a数组中             a[step] = i;            //因为i已经放进a数组,所有标记1把i标记为走了             book[i] = 1;            //下一步             dfs(step+1);            //收回             book[i] = 0;        }    }}int main() {    scanf("%d",&n);    dfs(1);    return 0;}

NYOJ 1058 部分和问题(经典题目dfs)
部分和问题
描述
给定整数a1、a2、…….an,判断是否可以从中选出若干数,使它们的和恰好为K。
输入
首先,n和k,n表示数的个数,k表示数的和。
接着一行n个数。
(1<=n<=20,保证不超int范围)
样例输入
4 13
1 2 4 7
样例输出
2 4 7

#include<stdio.h>int n, k, sum=0;//a用来存放数据,book用来做标记int a[10],book[10];void dfs(int step) {    //判断结束条件    //当sum>=k的时候进行判断,如果sum==k则可以输出,如果sum>k就可以结束    if(sum >= k) {    if(sum == k) {        for(int i=0; i<n; i++) {        //            if(book[i]==1)  printf("%d ", a[i]);        }        printf("\n");    }}    //遍历所有可能    for(int i=step; i<n; i++) {        sum += a[i]; //把数据加入到sum        book[i] = 1; //标记这个数据已经加入了        dfs(i+1);            //记得回收        sum -= a[i];        book[i] = 0;    }}int main() {    while(scanf("%d %d", &n, &k) == 2) {        for(int i=0; i<n; i++) {        scanf("%d", &a[i]);        }        dfs(0);    }    return 0;}

迷宫搜索

测试代码:
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
在坐标(1,1)走到(4,3)最短路径

#include<stdio.h> int p,q,n,m,min=999;int book[50][50],a[50][50];void dfs(int x, int y, int step) {    int tx, ty, k;    //下一个坐标next,下一步就四种走法,上下左右。    int next[4][2] = {{0,1}, {0,-1}, {1,0}, {-1,0}};    //判断结束条件    if(x==p && y==q) {        if(step < min) {            min = step;        }    }    //遍历所有可能,因为一个坐标到另一个坐标只有上下左右四种走法    for(k=0; k<=3; k++) {    //可以遍历上下左右        tx = x + next[k][0];        ty = y + next[k][1];        //判断是否越界,如果越界就跳过这个,继续下一个        if(tx>n || ty>m || tx<1 || ty<1) {            continue;        }            //判断是否有障碍点,和判断是否走过             if(a[tx][ty]==0 && book[tx][ty]==0) {                //标记这个点已经走过                book[tx][ty] = 1;                //下一个,继续递归                dfs(tx, ty, step+1);                //记得收回                 book[tx][ty] = 0;             }    }}int main() {    int startx, starty;    //输入迷宫行列     scanf("%d %d", &n, &m);    //输入迷宫     for(int i=1; i<=n; i++) {        for(int j=1; j<=m; j++) {            scanf("%d", &a[i][j]);        }    }    //输入起始坐标和目的坐标     scanf("%d %d %d %d", &startx, &starty, &p, &q);    //标记起始坐标     book[startx][starty] = 1;    //dfs搜索     dfs(startx, starty, 0);    //输出最小值     printf("%d", min);    return 0;}

输入:
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3


得到最短路径:7

0 0
原创粉丝点击