zoukankan      html  css  js  c++  java
  • UVA 10603 Fill

    这道题其实是个隐形图(bfs),由开始状态往后面推就行了

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<queue>
    #include<stack>
    #include<cmath>
    using namespace std;
    const int inf=0x3f3f3f3f;
    int vis[205][205][205];
    struct node{
    int x,y,z;
    int used;
    }xs;
    queue<node>p;
    int a,b,c,d;
    int ans[10005];
    int judge(int a1,int b1,int c1,int d1){
    if(vis[a1][b1][c1]>=d1+1)return 1;
    return 0;
    }
    void solve1(int a1,int b1,int c1,int d1){
    if(a1+b1<=a){
    if(vis[a1+b1][0][c1]>(b1+d1)){
    vis[a1+b1][0][c1]=d1+b1;
        p.push((node){a1+b1,0,c1,d1+b1});
    }
    }
    else {
    if(vis[a][a1+b1-a][c1]>(d1+a-a1)){
    vis[a][a1+b1-a][c1]=d1+a-a1;
    p.push((node){a,a1+b1-a,c1,d1+a-a1});
    }
    }

    if(a1+b1<=b){
    if(vis[0][a1+b1][c1]>(a1+d1)){
    vis[0][a1+b1][c1]=d1+a1;
        p.push((node){0,a1+b1,c1,d1+a1});
    }
    }
    else {
    if(vis[a1+b1-b][b][c1]>(d1+b-b1)){
    vis[a1+b1-b][b][c1]=d1+b-b1;
    p.push((node){a1+b1-b,b,c1,d1+b-b1});
    }
    }
    }


    void solve2(int a1,int b1,int c1,int d1);
    void solve3(int a1,int b1,int c1,int d1);
    void BFS(){
    p.push((node){0,0,c,0});
    vis[0][0][c]=0;
    ans[c]=ans[0]=0;
    while(p.size()){
    xs=p.front();p.pop();
    ans[xs.x]=min(ans[xs.x],xs.used);
    ans[xs.y]=min(ans[xs.y],xs.used);
    ans[xs.z]=min(ans[xs.z],xs.used);
    if(judge(xs.x,xs.y,xs.z,xs.used))continue;
    solve1(xs.x,xs.y,xs.z,xs.used);
    solve2(xs.x,xs.y,xs.z,xs.used);
    solve3(xs.x,xs.y,xs.z,xs.used);
    }
    }
    int cases;
    int main(){
    scanf("%d",&cases);
    while(cases--){
         scanf("%d%d%d%d",&a,&b,&c,&d);
         memset(ans,inf,sizeof(ans));
         memset(vis,inf,sizeof(vis));
         BFS();
         for(int i=d;i>=0;i--){
        if(ans[i]!=inf){
      printf("%d %d ",ans[i],i);
      break;
        }
        }
        }
        return 0;
    }


    void solve2(int a1,int b1,int c1,int d1){
    if(a1+c1<=a){
    if(vis[a1+c1][b1][0]>(d1+c1)){
    vis[a1+c1][b1][0]=d1+c1;
        p.push((node){a1+c1,b1,0,d1+c1});
    }
    }
    else {
    if(vis[a][b1][a1+c1-a]>(d1+a-a1)){
    vis[a][b1][a1+c1-a]=d1+a-a1;
    p.push((node){a,b1,a1+c1-a,d1+a-a1});
    }
    }

    if(a1+c1<=c){
    if(vis[0][b1][a1+c1]>(d1+a1)){
    vis[0][b1][a1+c1]=d1+a1;
        p.push((node){0,b1,a1+c1,d1+a1});
    }
    }
    else {
    if(vis[a1+c1-c][b1][c]>(d1+c-c1)){
    vis[a1+c1-c][b1][c]=d1+c-c1;
    p.push((node){a1+c1-c,b1,c,d1+c-c1});
    }
    }
    }


    void solve3(int a1,int b1,int c1,int d1){
    if(b1+c1<=b){
    if(vis[a1][b1+c1][0]>(d1+c1)){
    vis[a1][b1+c1][0]=d1+c1;
        p.push((node){a1,b1+c1,0,d1+c1});
    }
    }
    else {
    if(vis[a1][b][b1+c1-b]>(d1+b-b1)){
    vis[a1][b][c1+b1-b]=d1+b-b1;
    p.push((node){a1,b,c1+b1-b,d1+b-b1});
    }
    }

    if(c1+b1<=c){
    if(vis[a1][0][b1+c1]>(d1+b1)){
    vis[a1][0][b1+c1]=d1+b1;
        p.push((node){a1,0,b1+c1,d1+b1});
    }
    }
    else {
    if(vis[a1][b1+c1-c][c]>(d1+c-c1)){
    vis[a1][b1+c1-c][c]=d1+c-c1;
    p.push((node){a1,b1+c1-c,c,d1+c-c1});
    }
    }
    }

  • 相关阅读:
    10 个雷人的注释,就怕你不敢用!
    Java 14 之模式匹配,非常赞的一个新特性!
    poj 3661 Running(区间dp)
    LightOJ
    hdu 5540 Secrete Master Plan(水)
    hdu 5584 LCM Walk(数学推导公式,规律)
    hdu 5583 Kingdom of Black and White(模拟,技巧)
    hdu 5578 Friendship of Frog(multiset的应用)
    hdu 5586 Sum(dp+技巧)
    hdu 5585 Numbers
  • 原文地址:https://www.cnblogs.com/c201904xyorz/p/9990786.html
Copyright © 2011-2022 走看看