[容易] bfs状态搜索

九度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;
}



好的,我明白了。 1. 迷宫问题求解的搜索结果及分析: 迷宫问题是一种非常经典的搜索问题,通常使用搜索算法求解。常见的搜索算法有深度优先搜索(DFS)、广度优先搜索BFS)、A*算法等。 DFS是一种盲目搜索算法,其基本思想是从初始状态开始,不断向某个方向前进,直到无法再前进为止,然后返回上一个状态继续搜索。虽然DFS运行速度较快,但其搜索效率不高,容易陷入局部最优解。在解决迷宫问题时,DFS算法会不断探索迷宫中的某个方向,直到找到出口或者无法继续前进为止。 BFS是一种盲目搜索算法,其基本思想是按照距离逐层遍历,先遍历距离初始状态为1的所有状态,再遍历距离为2的所有状态,以此类推,直到找到目标状态为止。BFS算法具有较高的搜索效率,但其占用的内存较大。在解决迷宫问题时,BFS算法可以找到最短路径。 A*算法是一种启发式搜索算法,其基本思想是在搜索的过程中,根据启发函数对状态进行评估,以选择最有可能导致目标状态状态进行搜索。A*算法结合了DFS和BFS的优点,具有较高的搜索效率和较短的搜索路径。在解决迷宫问题时,A*算法可以更快地找到最短路径。 2. 比较状态搜索和与或图搜索的特点: 状态搜索和与或图搜索都是人工智能中的搜索算法,用于解决问题。它们的主要区别在于搜索的对象不同。 状态搜索是一种搜索状态图中的所有可能状态的算法。状态图是由状态状态之间的转移关系构成的图形结构。在状态搜索中,搜索的过程就是在状态图中不断地搜索下一个状态,直到找到目标状态为止。状态搜索算法适用于状态空间较小的问题。 与或图搜索是一种搜索与或图中的所有可能路径的算法。与或图是由节点和节点之间的条件关系和选择关系构成的图形结构。在与或图搜索中,搜索的过程就是在与或图中不断地选择下一个节点,直到找到目标节点为止。与或图搜索算法适用于状态空间较大的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值