| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4501 人关注过本帖, 1 人收藏
标题:(分享) 广度优先搜索,/ 深度优先搜索
只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
结帖率:94.72%
收藏(1)
已结贴  问题点数:20 回复次数:8 
(分享) 广度优先搜索,/ 深度优先搜索
简单的例程, 仅供参考

这两种搜索方式只在 数据结构的 接口上有所区别,
如果把这种接口用其他方式实现, 会得其他形式的搜索。

//广度优先搜索
#include <stdio.h>
#include <stdlib.h>

typedef struct bgEdge
{
    int v, w;
}Edge;

typedef struct bgQueue
{
    Edge* data;
    int maxLength;
    int head;
    int tail;
}BGQueue;
typedef BGQueue* Queue;

int matrix[8][8] = {0};

int edges[20][2] =
{
    {0, 2}, {2, 0},
    {0, 5}, {5, 0},
    {0, 7}, {7, 0},
    {2, 6}, {6, 2},
    {5, 3}, {3, 5},
    {5, 4}, {4, 5},
    {7, 1}, {1, 7},
    {7, 4}, {4, 7},
    {6, 4}, {4, 6},
    {3, 4}, {4, 3},
};

int pre[8] = {-1, -1, -1, -1, -1, -1, -1, -1};
int st[8] = {-1, -1, -1, -1, -1, -1, -1, -1};
int cnt = 0;

Queue queue;

void initQueue(int length);

void putQueue(Edge e);

Edge getQueue(void);

int isQueueEmpty(void);

int isQueueFull(void);

void bfs(Edge e);

int main(void)
{
    Edge t;
    int i = 0;

    initQueue(100);

    for (i = 0; i < 20; i++)
    {
        matrix[edges[i][0]][edges[i][1]] = 1;
    }

    t.v = 0;
    t.w = 0;

    bfs(t);

    return 0;
}

void bfs(Edge e)
{
    Edge t;
    int v;

    putQueue(e);

    while (!isQueueEmpty())
    {
        if (pre[(e = getQueue()).w] == -1)
        {
            pre[e.w] = cnt++;
            st[e.w] = e.v;

            for (v = 0; v < 8; v++)
            {
                if (matrix[e.w][v] == 1)
                {
                    if (pre[v] == -1)
                    {
                        t.v = e.w;
                        t.w = v;
                        putQueue(t);
                    }
                }
            }
        }
    }
}

void initQueue(int length)
{
    queue = malloc(sizeof(BGQueue));
   
    queue->data = malloc(sizeof(Edge) * length);
    queue->maxLength = length;
    queue->head = 0;
    queue->tail = 0;
}

void putQueue(Edge e)
{
    queue->data[queue->tail++] = e;
    queue->tail = queue->tail % queue->maxLength;
}

Edge getQueue(void)
{
    Edge ret;

    ret = queue->data[queue->head++];
    queue->head = queue->head % queue->maxLength;

    return ret;
}

int isQueueEmpty(void)
{
    return queue->head == queue->tail;
}

int isQueueFull(void)
{
    return ((queue->tail+1) % queue->maxLength) == queue->head;
}

//深度优先搜索
#include <stdio.h>
#include <stdlib.h>

typedef struct bgEdge
{
    int v, w;
}Edge;

typedef struct bgStack
{
    Edge* data;
    int top;
}BGStack;
typedef BGStack* Stack;

int matrix[8][8] = {0};

int edges[20][2] =
{
    {0, 2}, {2, 0},
    {0, 5}, {5, 0},
    {0, 7}, {7, 0},
    {2, 6}, {6, 2},
    {5, 3}, {3, 5},
    {5, 4}, {4, 5},
    {7, 1}, {1, 7},
    {7, 4}, {4, 7},
    {6, 4}, {4, 6},
    {3, 4}, {4, 3},
};

int pre[8] = {-1, -1, -1, -1, -1, -1, -1, -1};
int st[8] = {-1, -1, -1, -1, -1, -1, -1, -1};
int cnt = 0;

Stack stack;

void initStack(int length);

void pushStack(Edge e);

Edge popStack(void);

int isStackEmpty(void);

int isStackFull(void);

void dfs(Edge e);

int main(void)
{
    Edge t;
    int i = 0;

    initStack(100);

    for (i = 0; i < 20; i++)
    {
        matrix[edges[i][0]][edges[i][1]] = 1;
    }

    t.v = 0;
    t.w = 0;

    dfs(t);

    return 0;
}

void dfs(Edge e)
{
    Edge t;
    int v;

    pushStack(e);

    while (!isStackEmpty())
    {
        if (pre[(e = popStack()).w] == -1)
        {
            pre[e.w] = cnt++;
            st[e.w] = e.v;

            for (v = 0; v < 8; v++)
            {
                if (matrix[e.w][v] == 1)
                {
                    if (pre[v] == -1)
                    {
                        t.v = e.w;
                        t.w = v;
                        pushStack(t);
                    }
                }
            }
        }
    }
}

void initStack(int length)
{
    stack = malloc(sizeof(BGStack));
   
    stack->data = malloc(sizeof(Edge) * length);
    stack->top = 0;
}

void pushStack(Edge e)
{
    stack->data[stack->top++] = e;
}


Edge popStack(void)
{
    Edge ret;

    ret = stack->data[--stack->top];

    return ret;
}

int isStackEmpty(void)
{
    return (stack->top == 0);
}


[ 本帖最后由 BlueGuy 于 2011-1-22 10:26 编辑 ]
搜索更多相关主题的帖子: 搜索 接口 include matrix 
2011-01-20 13:29
刘定邦
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:687
专家分:1570
注 册:2010-9-21
收藏
得分:5 
学习..再学习.
2011-01-20 14:03
limingzhen90
Rank: 2
等 级:论坛游民
帖 子:53
专家分:72
注 册:2010-12-31
收藏
得分:5 
分享了!

入门了吗?
2011-01-20 15:42
sunmingchun
Rank: 4
来 自:安徽-滁州
等 级:业余侠客
帖 子:198
专家分:277
注 册:2010-4-2
收藏
得分:5 
先学习了!
2011-01-20 17:32
cc152jj
Rank: 1
等 级:新手上路
帖 子:4
专家分:5
注 册:2010-11-2
收藏
得分:5 
我们也学,就是没学通,数据结构中,的虽然简练,但老是行不通。
2011-01-22 06:26
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
楼主的代码 和 置顶的那个 八数码 果然一模一样,/

这里的 广度优先搜索 就是没有经过优化的版本,

[ 本帖最后由 BlueGuy 于 2011-1-29 21:26 编辑 ]
收到的鲜花
  • 观弈寒儒2011-02-24 13:19 送鲜花  -2朵   附言:马甲,不可原谅!

我就是真命天子,顺我者生,逆我者死!
2011-01-29 21:24
马后炮
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:156
专家分:560
注 册:2010-12-17
收藏
得分:0 
以下是引用BlueGuy在2011-1-29 21:24:11的发言:

楼主的代码 和 置顶的那个 八数码 果然一模一样,/

这里的 广度优先搜索 就是没有经过优化的版本,
你是不是忘记换马甲号说了啊
收到的鲜花
  • 观弈寒儒2011-02-24 12:45 送鲜花  5朵   附言:我很赞同
  • 观弈寒儒2011-02-24 12:45 送鲜花  5朵  
  • pangding2011-02-24 16:43 送鲜花  5朵   附言:6楼真的很有意思

樱之雪,晓之车
2011-01-29 23:44
观弈寒儒
Rank: 7Rank: 7Rank: 7
来 自:自 来
等 级:黑侠
帖 子:359
专家分:545
注 册:2011-1-9
收藏
得分:0 
有意思,传说中的马甲。。。

事件记录,值得关注! http://bbs.bccn.net/z_court.php?fid=5
2011-02-24 12:45
mysteryice
Rank: 2
等 级:论坛游民
帖 子:30
专家分:26
注 册:2010-4-4
收藏
得分:0 
代码可能很好,就是没看懂。
2011-03-04 12:08
快速回复:(分享) 广度优先搜索,/ 深度优先搜索
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.057525 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved