深度优先搜索--DFS

来源:互联网 发布:海岛奇研究所升级数据 编辑:程序博客网 时间:2024/04/18 10:20

深度优先搜索

dfs思想

解决当下如何做,下一步如何做和当下如何做一样。

要求

求1~n的全排列。

代码

#include <stdio.h>#define N 3int a[10];int book[10];void dfs(int step) {    int i;    if (step == N + 1) {        for (i = 1; i <= N; ++i) {            printf("%d ", a[i]);        }        printf("\n");        return;    }    for (i = 1; i <= N; ++i) {        if (book[i] == 0) {            a[step] = i;            book[i] = 1;            dfs(step+1);            book[i] = 0;        }    }    return;}int main() {    dfs(1);    return 0;}

要求

在括号中填入1~9的数字,使等式成立,每个数字只能使用一次。
[ ][ ][ ] + [ ][ ][ ] = [ ][ ][ ]

代码

#include <stdio.h>int a[10];int book[10];int sum;void dfs(int step) {    int i;    if (step == 10) {        if (a[1]*100 + a[2]*10 + a[3] + a[4]*100 + a[5]*10 + a[6] == a[7]*100 + a[8]*10 + a[9]) {            sum++;            printf("%d%d%d + %d%d%d = %d%d%d \n", a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]);        }        return;    }    for (i = 1; i <= 9; ++i) {        if (book[i] == 0) {            a[step] = i;            book[i] = 1;            dfs(step+1);            book[i] = 0;        }    }}int main() {    dfs(1);    printf("%d \n", sum / 2);    return 0;}

要求

求迷宫中从坐标(0, 0)到(3,2)最少步数?

0代表路,1代表障碍物,2标识走过的路径,3代表目标点。

代码

#include <stdio.h>#define N 5#define M 4int min = 99999999;int a[N][M] = {                {0, 0,  1, 0},                {0, 0,  0, 0},                {0, 0,  1, 0},                {0, 1,  3, 0},                {0, 0,  0, 1}               };void print_a() {    for (int i = 0; i < N; ++i)    {        for (int j = 0; j < M; ++j)        {            printf("%d ", a[i][j]);        }        printf("\n");    }    printf("\n");}void dfs(int x, int y, int step) {    if (a[x][y] == 3) {        printf("--------------- step : %d\n", step);        print_a();        if (step < min) {            min = step;        }        return;    }    a[x][y] = 2;  // 走过的点标记为2    if((a[x][y+1] == 0 || a[x][y+1] == 3) && y+1 < M) {  // right        dfs(x, y+1, step+1);    }    if((a[x+1][y] == 0 || a[x+1][y] == 3) && x+1 < N) {  // down        dfs(x+1, y, step+1);    }    if((a[x][y-1] == 0 || a[x][y-1] == 3) && y-1 >= 0) {  // left        dfs(x, y-1, step+1);    }    if((a[x-1][y] == 0 || a[x-1][y] == 3) && x-1 >= 0) {  // up        dfs(x-1, y, step+1);    }    a[x][y] = 0;   // 取消标记}int main() {    dfs(0, 0, 0);    printf("min: %d \n", min);    return 0;}
0 0
原创粉丝点击