Smallest number(dfs全排列)

Smallest number - 洛谷

 

#include
#define int long long
using namespace std;
int a[10];
string s[5];
bool vis[10];
int ans=1e13;//0x3f=1e9,所有有点不够
void dfs(int u)
{
//    for(int i=0;i<4;i++)
//    {
//        printf("%d ",a[i]);
//    }
//    printf("\n");
//    for(int i=0;i<4;i++)
//    {
//        printf("%d ",vis[i]);
//    }
//    printf("\n");
    if(u==3)
    {
        for(int i=0;i<4;i++)
        {
            if(vis[i]==0)
                ans=min(ans,a[i]);//没有被记录的数就是最终结果,求最小
        }
//        printf("return\n");
        return;
    }
    for(int i=0;i<4;i++)
    {
        if(vis[i])continue;
        for(int j=0;j<4;j++)
        {
            if(j==i||vis[j])continue;//若为同一个数或已被选用,跳过
            int last=a[j];//last不能为全局变量
            if(s[u]=="+")
            {
                vis[i]=1;
//                last=a[j];
                a[j]+=a[i];
                dfs(u+1);
                vis[i]=0;
                a[j]=last;
            }
            else if(s[u]=="*")
            {
                vis[i]=1;
//                last=a[j];
                a[j]*=a[i];
                dfs(u+1);
                vis[i]=0;
                a[j]=last;
            }
        }
    }
}
signed main()
{
    for(int i=0;i<4;i++)
    {
        scanf("%lld",&a[i]);
    }
    for(int i=0;i<3;i++)
    {
        cin>>s[i];
    }
    dfs(0);
    printf("%lld\n",ans);
}

你可能感兴趣的:(算法,c++,深度优先)