水杯问题(就是一个简单的广搜)

来源:互联网 发布:网站源码建站 编辑:程序博客网 时间:2024/04/29 02:23

 题目链接:点击打开链接

代码:

#include<stdio.h>#include<queue>#include<algorithm>using namespace std;#include<string.h>struct node{    int v[3],step;} ini,temp;int a[3],ed[3],vis[1010][1010];void bfs(){    queue<node>q;    memset(vis,0,sizeof(vis));    ini.v[0]=a[0];    ini.step=ini.v[1]=ini.v[2]=0;    q.push(ini);    vis[a[0]][0]=1;
这个一定不能忘记,标记出现过的状态!!!!    while(!q.empty())    {        int i,j;        ini=q.front();        q.pop();        for(i=0; i<3&&ini.v[i]>=0; i++)        {
个人觉得,这里判不判断都无所谓!            for(j=0; j<3; j++)                if(i!=j)                {                    temp=ini;                    if(ini.v[0]==ed[0]&&ini.v[1]==ed[1])                    {                        printf("%d\n",ini.step);                        return ;                        结束函数;                    }                    if(ini.v[i]+ini.v[j]<=a[j])                    {                        temp.v[i]=0;                        temp.v[j]=ini.v[j]+ini.v[i];                    }                    else                    {                        temp.v[i]=ini.v[i]+ini.v[j]-a[j];                        temp.v[j]=a[j];                    }                    if(!vis[temp.v[0]][temp.v[1]])                    {                        temp.step=ini.step+1;                        if(temp.v[0]==ed[0]&&temp.v[1]==ed[1])                        {                            printf("%d\n",temp.step);                            return ;                        }                        vis[temp.v[0]][temp.v[1]]=1;                        q.push(temp);                    }                }        }    }    printf("-1\n");}int main(){    int t;    scanf("%d",&t);    while(t--)    {        for(int i=0; i<3; i++)            scanf("%d",&a[i]);        for(int i=0; i<3; i++)            scanf("%d",&ed[i]);        bfs();    }    return 0;}
每次只可以倒一次水,枚举所有的倒水的状态,直接广搜(so easy,大二了啊,再不so easy 有点说不过去了啊)

0 0
原创粉丝点击