当前位置: 首页 > 工具软件 > kele > 使用案例 >

M - 非常可乐 HDU - 1495 (kele)

焦同
2023-12-01

M - 非常可乐

 HDU - 1495 

 

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
int s,n,m,ans;
bool vis[101][101][101];//所有状态得标记。
bool flag;
void dfs(int x,int y,int z,int step)
{
    if((x==s/2&&y==s/2)||(x==s/2&&z==s/2)||(y==s/2&&z==s/2))
    {
        ans=min(ans,step);
        flag=1;
        return;
    }
    if(x>0&&y<n)
    {
        int t=min(x,n-y);
        if(!vis[x-t][y+t][z])
        {
            vis[x-t][y+t][z]=1;
            dfs(x-t,y+t,z,step+1);
            vis[x-t][y+t][z]=0;
        }
    }
    if(x>0&&z<s)
    {
        int t=min(x,s-z);
        if(!vis[x-t][y][z+t])
        {
            vis[x-t][y][z+t]=1;
            dfs(x-t,y,z+t,step+1);
            vis[x-t][y][z+t]=0;
        }
    }
    if(y>0&&x<m)
    {
        int t=min(y,m-x);
        if(!vis[x+t][y-t][z])
        {
            vis[x+t][y-t][z]=1;
            dfs(x+t,y-t,z,step+1);
            vis[x+t][y-t][z]=0;
        }
    }
    if(y>0&&z<s)
    {
        int t=min(y,s-z);
        if(!vis[x][y-t][z+t])
        {
            vis[x][y-t][z+t]=1;
            dfs(x,y-t,z+t,step+1);
            vis[x][y-t][z+t]=0;
        }
    }
    if(z>0&&y<n)
    {
        int t=min(z,n-y);
        if(!vis[x][y+t][z-t])
        {
            vis[x][y+t][z-t]=1;
            dfs(x,y+t,z-t,step+1);
            vis[x][y+t][z-t]=0;
        }
    }
    if(z>0&&x<m)
    {
        int t=min(z,m-x);
        if(!vis[x+t][y][z-t])
        {
            vis[x+t][y][z-t]=1;
            dfs(x+t,y,z-t,step+1);
            vis[x+t][y][z-t]=0;
        }
    }

}
int main()
{
    while(cin>>s>>m>>n)
    {
        if(s == 0 && n == 0 && m == 0) break;
        if(s % 2)
        {
            cout<<"NO"<<endl;
            continue;
        }
        ans=inf;
        flag=0;
        vis[0][0][s] =1;
        dfs(0,0,s,0);
        if(flag)
            cout<<ans<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}
 类似资料: