1. 程式人生 > >【ZCMU1795】wjw的hard problem(dfs)

【ZCMU1795】wjw的hard problem(dfs)

題目連結

1795: wjw的hard problem

Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 70  Solved: 22 [Submit][Status][Web Board]

Description

ly最近給wjw出了一個很難很難的題目,ly給了wjw一串數字,wjw可以在這串數字中間插入一個“=”使得這串數字變成一個等式,然後他還可以插入不限個數個"+",比如“945”可以分成9=4+5,“3434”可以分成“34=34”或者“3+4=3+4”兩個等式,因為數字長度一增加,wjw就不會算了,現在他請你幫他算一下每個數字串有能分成多少種等式?

Input

每組測試資料有多組,每組一個數字串,長度保證(2<=len<=20),輸入以0結尾

Output

對每組資料輸出,每組一行,包含一個整數,表示答案

Sample Input

1212

1235

0

Sample Output

2

0

HINT

Source

【解題思路】

1.列舉等號的位置,等號的位置只可能在0~len-1個字元的後面

2.sum1為的等號左邊的和,sum2為等號右邊的和,x為當前所計算到的字元的值。

3.因為考慮到每次遍歷到的字元是可以和上一個字元組合的,所以有個x=x*10+s[deep]-'0'的操作。當遍歷到一個等號時,當前字元不能再往下傳和下一個字元組合了,所以需要把當前的值加到sum1上。還有一種情況是當遍歷到最後一個字元時,沒有下一個字元了,所以必須把當前的值加到sum2上。

【程式碼】

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
char s[25];
int len,ans,pos;
void dfs(int deep,LL sum1,LL sum2,LL x)
{
    if(deep>=len)
    {
        if(sum1==sum2)ans++;
        return;
    }
    x=x*10+s[deep]-'0';
    if(deep==pos)dfs(deep+1,sum1+x,0,0);//等號位置
    else
    {
        if(deep!=len-1)dfs(deep+1,sum1,sum2,x);//該位字元和上一位字元組合的情況
        if(deep<pos)dfs(deep+1,sum1+x,0,0);//等號左邊
        else dfs(deep+1,sum1,sum2+x,0);//等號右邊
    }
}
int main()
{
    while(~scanf("%s",s))
    {
        len=strlen(s);
        if(len==1 && s[0]=='0')return 0;
        ans=0;
        for(int i=0;i<len-1;i++)
        {
            pos=i;
            dfs(0,0,0,0);
        }
        printf("%d\n",ans);
    }
    return 0;
}