您的位置:首页 > 其它

HDU 4430 A very hard Aoshu problem DFS 数学式子

2013-08-06 14:45 309 查看
比赛结束后,听人家说才知道是个dfs的题,枚举=的位置,然后看两边的结果有没有相同的,有就ans++,等号两边的每个位置要么放上+,要么不放。另外因为题目中说1+11=12和11+1=12是2种,所以不能只存等号左边的结果12,还要存能得到的12的个数,我直接用vector存的,扫面一遍有相同的就加1.这个dfs写了两三个小时,代码能力还是太差了。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<set>
#include<cstring>
#include<algorithm>
#define MAXN 500010
using namespace std;
char str[20];
bool save[20];
int ans,i;
set<int>st1;
vector<int>st;
void dfs(int cur,int end,int sum)
{
    if(cur==end)
    {
        int temp=cur;
        while(save[temp]==false&&temp>=0)
            temp--;
        int num=0;
        for(int j=++temp; j<=cur; j++)
            num=num*10+str[j]-'0';
        sum+=num;
        st.push_back(sum);
        return ;
    }
    save[cur]=true;
    int num=0;
    int temp=cur-1;
    while(save[temp]==false&&temp>=0)
        temp--;
    for(int j=++temp; j<=cur; j++)
        num=num*10+str[j]-'0';
    sum+=num;
    dfs(cur+1,end,sum);
    save[cur]=false;
    sum-=num;
    dfs(cur+1,end,sum);
}
void dfs2(int cur,int end,int sum)
{
    if(cur==end)
    {
        int temp=cur;
        while(save[temp]==false&&temp>i)
            temp--;
        int num=0;
        for(int j=++temp; j<=cur; j++)
            num=num*10+str[j]-'0';
        sum+=num;
        for(int j=0; j<(int)st.size(); j++)
        {
            if(sum==st[j])
                ans++;
        }
        return ;
    }
    save[cur]=true;
    int num=0;
    int temp=cur-1;
    while(save[temp]==false&&temp>i)
        temp--;
    for(int j=++temp; j<=cur; j++)
        num=num*10+str[j]-'0';
    sum+=num;
    dfs2(cur+1,end,sum);
    save[cur]=false;
    sum-=num;
    dfs2(cur+1,end,sum);
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(cin>>str&&strcmp(str,"END")!=0)
    {
        int len=strlen(str);
        ans=0;
        for(i=0; str[i+1]!='\0'; i++)
        {
            st.clear();
            memset(save,false,sizeof(save));
            dfs(0,i,0);
            dfs2(i+1,len-1,0);
        }
        cout<<ans<<endl;
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: