nyoj+bfs三个水杯

点击打开链接

 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
struct Node{
    int v1,v2,v3,steps;
};
queue<Node>Q;
int V1=0,V2=0,V3=0,E1=0,E2=0,E3=0,visit[105][105][105];
int check(Node temp)
{
    if(temp.v1==E1&&temp.v2==E2&&temp.v3==E3)
        return 1;
    return 0;
}
void BFS()
{
    while(!Q.empty()) Q.pop();
    memset(visit,0,sizeof(visit));
    Node n,temp,temp1;
    n.v1=V1,n.v2=0,n.v3=0,n.steps=0;
    visit[n.v1][n.v2][n.v3]=1;
    Q.push(n);
    while(!Q.empty()){
        temp1=Q.front(); Q.pop();
        if(check(temp1)) {
            printf("%d\n",temp1.steps);
            return;
        }
        temp=temp1;
        if(temp.v2!=V2&&temp.v1){///pour V1->V2,temp.v1有水且temp.v2未满
            if(temp.v1<=V2-temp.v2){///V1 water is not enough
                temp.v2+=temp.v1;
                temp.v1=0;
            }
            else{
                temp.v1-=(V2-temp.v2);
                temp.v2=V2;
            }
            if(!visit[temp.v1][temp.v2][temp.v3]){
                temp.steps+=1;
                Q.push(temp);
                visit[temp.v1][temp.v2][temp.v3]=1;///最少步数嘛,一定要标记防重复
            }
        }
        temp=temp1;
        if(temp.v3!=V3&&temp.v1){///pour V1->V3
            if(temp.v1<=V3-temp.v3){///V1 water is not enough
                temp.v3+=temp.v1;
                temp.v1=0;
            }
            else{
                temp.v1-=(V3-temp.v3);
                temp.v3=V3;
            }
            if(!visit[temp.v1][temp.v2][temp.v3]){
                temp.steps+=1;
                Q.push(temp);
                visit[temp.v1][temp.v2][temp.v3]=1;
            }
        }
          temp=temp1;
          if(temp.v1!=V1&&temp.v2){///pour V2->V1
            if(temp.v2<=V1-temp.v1){///V2 water is not enough
                temp.v1+=temp.v2;
                temp.v2=0;
            }
            else{
                temp.v2-=(V1-temp.v1);
                temp.v1=V1;
            }
            if(!visit[temp.v1][temp.v2][temp.v3]){
                temp.steps+=1;
                Q.push(temp);
                visit[temp.v1][temp.v2][temp.v3]=1;
            }
        }
         temp=temp1;
         if(temp.v3!=V3&&temp.v2){///pour V2->V3
            if(temp.v2<=V3-temp.v3){///V2 water is not enough
                temp.v3+=temp.v2;
                temp.v2=0;
            }
            else{
                temp.v2-=(V3-temp.v3);
                temp.v3=V3;
            }
            if(!visit[temp.v1][temp.v2][temp.v3]){
                temp.steps+=1;
                Q.push(temp);
                visit[temp.v1][temp.v2][temp.v3]=1;
            }
        }
          temp=temp1;
         if(temp.v1!=V1&&temp.v3){///pour V3->V1
            if(temp.v3<=V1-temp.v1){///V1 water is not enough
                temp.v1+=temp.v3;
                temp.v3=0;
            }
            else{
                temp.v3-=(V1-temp.v1);
                temp.v1=V1;
            }
            if(!visit[temp.v1][temp.v2][temp.v3]){
                temp.steps+=1;
                Q.push(temp);
                visit[temp.v1][temp.v2][temp.v3]=1;
            }
        }
         temp=temp1;
         if(temp.v2!=V2&&temp.v3){///pour V3->V2
            if(temp.v3<=V2-temp.v2){///V1 water is not enough
                temp.v2+=temp.v3;
                temp.v3=0;
            }
            else{
                temp.v3-=(V2-temp.v2);
                temp.v2=V2;
            }
            if(!visit[temp.v1][temp.v2][temp.v3]){
                temp.steps+=1;
                Q.push(temp);
                visit[temp.v1][temp.v2][temp.v3]=1;
            }
        }
    }
  printf("-1\n");
}
int main()
{
   int N=0;
   scanf("%d",&N);
   while(N--){
        scanf("%d%d%d%d%d%d",&V1,&V2,&V3,&E1,&E2,&E3);
        BFS();
   }
   return 0;
}
        

x1y2 x2y3 x3y1-x1y3-x2y1-x3y2 是计算三角形面积的公式中的一部分。 在这个公式中,x1、x2、x3分别表示三角形的三个顶点的x坐标,y1、y2、y3分别表示三角形的三个顶点的y坐标。通过计算这个表达式的值,可以得到三角形的面积。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [TetraCluster:使用并行Java 2库的Java并行程序。 该程序在群集并行计算机上运行,​​以从给定的点集中找到...](https://download.csdn.net/download/weixin_42171208/18283141)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [线性代数有个题,求正交变换x=Qy,化二次型f(x1,x2,x3)=8x1x2+8x1x3+8x2x3为标准型求出特征值](https://blog.csdn.net/weixin_39956182/article/details/115882118)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [nyoj-67-三角形面积(S=(1/2)*(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2))](https://blog.csdn.net/weixin_30492601/article/details/99541033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值