• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > c语言实现bfs状态搜索

c语言实现bfs状态搜索

作者:zypang1的博客 字体:[增加 减小] 来源:互联网 时间:2017-08-27

zypang1的博客通过本文主要向大家介绍了bfs,状态搜索等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

九度oj1457

 

题目描述:

大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升(正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。

输入:

三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。

输出:

如果能平分的话请输出最少要倒的次数,否则输出"NO"。

样例输入:

7 4 3
4 1 3
0 0 0

样例输出:

NO
3

思路:

 

 

 

首先将题目建模为状态以及状态转换,然后又是求最小步数,自然想到BFS,可以用BFS来做一个状态搜索。

具体代码:

 

#include <iostream>
#include <queue>
#include <cstring>

using namespace std;
struct state
{
    int vol[3];
    int step;
    state(int s=0,int n=0,int m=0,int st=0)
    {
        vol[0]=s;
        vol[1]=n;
        vol[2]=m;
        step=st;
    }
};
int S,N,M;
int getMaxVol(int id)
{
    switch(id)
    {
    case 0:
        return S;
    case 1:
        return N;
    case 2:
        return M;
    }
}
const int maxn=100+5;
bool visited[maxn][maxn][maxn];
void pour(const state& ori,int a,int b,state& ans)
{
    ans=ori;
    int bm=getMaxVol(b);
    int bl=bm-ori.vol[b];
    int al=ori.vol[a]-bl;
    if(al<=0)
    {
        ans.vol[a]=0;
        ans.vol[b]=ori.vol[a]+ori.vol[b];
    }
    else
    {
        ans.vol[a]=al;
        ans.vol[b]=bm;
    }
    ans.step=ori.step+1;
}
int bfs()
{
    memset(visited,0,sizeof visited);
    int final=S/2;
    queue<state> q;
    q.push(state(S,0,0,0));
    while(!q.empty())
    {
        state ori=q.front();q.pop();
        visited[ori.vol[0]][ori.vol[1]][ori.vol[2]]=true;
        for(int i=0;i<3;++i)
        {
            for(int j=0;j<3;++j)
            {
                if(i==j) continue;
                state ans;
                pour(ori,i,j,ans);
                if(ans.vol[0]==final&&ans.vol[1]==final||
                        ans.vol[1]==final&&ans.vol[2]==final||ans.vol[0]==final&&ans.vol[2]==final)
                {
                    return ans.step;
                }
                if(!visited[ans.vol[0]][ans.vol[1]][ans.vol[2]])
                    q.push(ans);

            }
        }
    }
    return -1;
}

int main()
{
    for(cin>>S>>N>>M;S!=0;cin>>S>>N>>M)
    {
        if(S%2==1)
        {
            cout<<"NO"<<endl;
            continue;
        }
        int st=bfs();
        if(st==-1)
            cout<<"NO"<<endl;
        else
            cout<<st<<endl;
    }
    return 0;
}

 

 

 

 

 

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • c语言实现bfs状态搜索

相关文章

  • 2017-05-28C++命名空间实例解析
  • 2017-05-28C++之Boost::array用法简介
  • 2017-05-28对比C语言中memccpy()函数和memcpy()函数的用法
  • 2017-05-28STL各个容器性能详细比较
  • 2017-05-28利用C语言来求最大连续子序列乘积的方法
  • 2017-05-28深入理解双指针的两种用法
  • 2017-10-30Find K-th Smallest Pair Distance:查找数组元素中差值第K大的两个元素的差值
  • 2017-05-28c++ STL set_difference set_intersection set_union 操作
  • 2017-05-28高效实现整型数字转字符串int2str的方法
  • 2017-05-28基于C语言实现的扫雷游戏代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C 语言基础教程(我的C之旅开始了)[四]
    • C++多线程编程简单实例
    • VC随机函数srand和rand用法
    • 关闭显示器软件代码分享
    • VisualStudio 使用Visual Leak Detector检查内存泄漏
    • 学编程难吗?多久能入门?
    • 基于Windows API实现遍历所有文件并删除的方法
    • c语言中static的用法详细示例分析
    • new和malloc的区别深入解析
    • C++ new、delete(new[]、delete[])操作符重载需要注意的问题

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有