• 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});
    }
    }
    }

  • 相关阅读:
    安卓开发环境的演变
    对软件工程实践课程的预定目标
    Angular4.0踩坑之路:探索子路由和懒加载
    Angular4.0踩坑之路:如何成功读取本地json文件
    Angular踩坑之路:在Angular中监听键盘事件
    Angular踩坑之路:初探Angular过程中的一些总结与记录
    Angular踩坑之路:初探webpack
    Angular踩坑之路:设置开发环境
    (Nodejs)安装教程、切换全局模块安装路径、切换npm下载源
    (ES、ik分词器)ES的分词器插件elasticsearch-analysis-ik
  • 原文地址:https://www.cnblogs.com/c201904xyorz/p/9990786.html
Copyright © 2020-2023  润新知