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\n",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});
}
}
}

posted @ 2018-02-10 18:17  c201904  阅读(89)  评论(0编辑  收藏  举报