| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1374 人关注过本帖, 1 人收藏
标题:求教广度优先搜索
只看楼主 加入收藏
BIT112016197
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-10-18
结帖率:66.67%
收藏(1)
 问题点数:0 回复次数:8 
求教广度优先搜索
广度优先搜索运用了哪些知识,感觉有点跳跃,不知道怎么理解。
更不知道该怎么运用它,有大神可以教一下吗
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。
Input
三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。
Output
如果能平分的话请输出最少要倒的次数,否则输出"NO"。
Sample Input
7 4 3
4 1 3
0 0 0
Sample Output
NO
3
搜索更多相关主题的帖子: 喝可乐 而且 一瓶 知识 
2016-12-20 17:37
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
以 7 4 3 为例

初态 (7 0 0)

下一个状态有2 种 (3 4 0), (4 0 3)

再下一个状态分别有3种 (0 4 3), (7 0 0), (3 1 3) 和 (0 4 3), (7 0 0), (4 3 0)
去掉重复后 (0 4 3), (3 1 3), (4 3 0)

再下一个状态有4种 (4 0 3), (3 4 0)   (0 4 3), (4 0 3), (6 1 0), (3 4 0)   (3 4 0), (1 3 3), (7 0 0), (4 0 3)
去掉重复后 (4 0 3), (3 4 0), (6 1 0), (1 3 3)

......

获取所有的下一状态,先进先出进行判断,直到队列空或者找到终点(平分)


[fly]存在即是合理[/fly]
2016-12-20 18:02
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
总之,N+M和为奇数不能平分~
这条题和广度搜索关系不大,直接解就是先把S倒入较小的容器 然后把较小的容器倒入较大的容器,重复以上操作,一个循环即可解决~原理,S容器不会溢出,要想得到新值,必需要有溢出处理~当然,反过来把较大的容器倒进较小容器也是可以的,但循环步骤不能变~

[此贴子已经被作者于2016-12-20 21:30编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-20 20:08
BIT112016197
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-10-18
收藏
得分:0 
回复 2楼 azzbcc
bfs基础为零,看代码都看不懂,队列知识也不清楚。可以告诉我你怎么学的基础知识吗?谢谢
2016-12-20 22:42
BIT112016197
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-10-18
收藏
得分:0 
回复 3楼 九转星河
能告诉我怎么学bfs吗?
2016-12-20 22:44
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 BIT112016197
我数据结构才刚刚起步,你不说我也不知道有bfs算法
那个我也要花时间去研究一下好让我把迷宫最短路径解给求出来~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-20 22:48
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
额,debug 一步步跟进,同时查看所有变量

草稿纸上画一下变化。

程序代码:
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <stdbool.h>

#define MAX 128
#define MIN(x, y)  ((x) < (y)) ? (x) : (y)

typedef struct __tag_status
{
    int s, m, n, step;
} Status;
// 判断两种状态是否相等
bool EquelStatus(Status *from, Status *to)
{
    return from->s == to->s && from->m == to->m && from->n == to->n;
}

typedef struct __tag_queue
{
    int front, rear;
    Status data[MAX];
} Queue;
// 入队列
void EnQueue(Queue *queue, Status *status)
{
    if (queue->rear == MAX)  exit(EXIT_FAILURE);
    queue->data[queue->rear++] = *status;
}
// 出队列
void DeQueue(Queue *queue, Status *status)
{
    *status = queue->data[queue->front++];
}
// 队列空
bool EmptyQueue(Queue *queue)
{
    return queue->front >= queue->rear;
}
// 队列中是否存在这个状态
bool StatusInQueue(Queue *queue, Status *status)
{
    for (int i = 0; i < queue->rear; ++i)
    {
        if (EquelStatus(&queue->data[i], status)) return true;
    }
    return false;
}

typedef enum __tag_action
{
    S_TO_M, S_TO_N, M_TO_S, M_TO_N, N_TO_S, N_TO_M
} Action;
// 当前状态是否可以执行动作
bool CanMove(Status *status, Action action, Status *max)
{
    switch (action)
    {
    case S_TO_M: return status->s > 0 && status->m < max->m;
    case S_TO_N: return status->s > 0 && status->n < max->n;
    case M_TO_S: return status->m > 0 && status->s < max->s;
    case M_TO_N: return status->m > 0 && status->n < max->n;
    case N_TO_S: return status->n > 0 && status->s < max->s;
    case N_TO_M: return status->n > 0 && status->m < max->m;
    }
    return false;
}
// 获取执行action动作后的下一状态
Status Move(Status *status, Action action, Status *max)
{
    Status next = *status;

    switch (action)
    {
    case S_TO_M:
        next.m = MIN(max->m, status->s + status->m);
        next.s = status->s + status->m - next.m;
        break;
    case S_TO_N:
        next.n = MIN(max->n, status->s + status->n);
        next.s = status->s + status->n - next.n;
        break;
    case M_TO_S:
        next.s = MIN(max->s, status->m + status->s);
        next.m = status->m + status->s - next.s;
        break;
    case M_TO_N:
        next.n = MIN(max->n, status->m + status->n);
        next.m = status->m + status->n - next.n;
        break;
    case N_TO_S:
        next.s = MIN(max->s, status->n + status->s);
        next.n = status->n + status->s - next.s;
        break;
    case N_TO_M:
        next.m = MIN(max->m, status->n + status->m);
        next.n = status->n + status->m - next.m;
        break;
    }
    next.step += 1;

    return next;
}

// 成功结束标志
bool EndStatus(Status *status, int s)
{
    if (s % 2) return false;
    int ans = 0;
    ans += status->s == s / 2;
    ans += status->m == s / 2;
    ans += status->n == s / 2;

    return ans >= 2;
}
// 广搜
void bfs(int s, int m, int n)
{
    Queue queue = {0};
    Status max = {INT_MAX, m, n}, beg = {.s = s};

    EnQueue(&queue, &beg);
    while (!EmptyQueue(&queue))
    {
        Status now;
        DeQueue(&queue, &now);

        // 判断是否为终止状态
        if (EndStatus(&now, s))
        {
            printf("%d\n", now.step);
            return;
        }

        // 将下一状态入队列
        for (Action action = S_TO_M; action <= N_TO_M; ++action)
        {
            if (CanMove(&now, action, &max))
            {
                Status next = Move(&now, action, &max);
                if (!StatusInQueue(&queue, &next))
                {
                    EnQueue(&queue, &next);
                }
            }
        }
    }

    printf("NO\n");
}

int main(int argc, char *argv[])
{
    bfs(7, 4, 3);
    bfs(4, 1, 3);
    return 0;
}


[此贴子已经被作者于2016-12-21 11:39编辑过]



[fly]存在即是合理[/fly]
2016-12-21 11:32
BIT112016197
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-10-18
收藏
得分:0 
求教广度和深度优先搜索
2016-12-25 19:48
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 8楼 BIT112016197
这个,最好到数据结构版块去讨论~毕竟这里大都没学到数据结构耶~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-25 19:52
快速回复:求教广度优先搜索
数据加载中...
 
   



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

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