标签:
http://acm.hdu.edu.cn/showproblem.php?pid=4403
1212 12345666 1235 END
2 2 0
/**
hdu4403 暴力搜索
题目大意:给定一个由数字组成的字符串,用一个等号号若干个加号将字符串连接,不许改变字符的顺序,问有多少中方法能够使等式成立
解题思路:题目数据较小,采取用暴力搜索得方法过的。枚举等号的位置进行搜索,复杂度O(2^n)
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;
char s[20];
int a[20],b[20],num;
int k1,k2,tt;
void judge(int t,int flag,int sum,int cnt,LL ans)
{
//printf("(%d %d %d %d %I64d)\n",t,flag,sum,cnt,ans);
//getchar();
LL x,y;
if(flag==0)
{
y=cnt;
x=sum*10+b[t];
}
else
{
y=sum+cnt;
x=b[t];
}
if(t==k2-1)
{
if(x+y==ans)
{
///printf("%I64d %I64d\n",x+y,ans);
num++;
}
return;
}
judge(t+1,0,x,y,ans);
judge(t+1,1,x,y,ans);
}
void dfs(int t,int flag,int sum,int cnt)///第t位,第t位前面是有加号
{
//printf("%d %d %d %d\n",t,flag,sum,cnt);
//getchar();
LL x,y;
if(flag==0)
{
y=cnt;
x=sum*10+a[t];
}
else
{
y=sum+cnt;
x=a[t];
}
if(t==k1-1)
{
// printf("%I64d\n",x+y);
judge(0,0,0,0,x+y);
return;
}
dfs(t+1,0,x,y);
dfs(t+1,1,x,y);
}
int main()
{
while(~scanf("%s",s))
{
if(s[0]=='E')break;
int n=strlen(s);
num=0;
for(int i=0;i<n-1;i++)
{
k1=0,k2=0;
for(int j=0;j<=i;j++)
a[k1++]=s[j]-'0';
for(int j=i+1;j<n;j++)
b[k2++]=s[j]-'0';
/* for(int j=0;j<k1;j++)
printf("%d ",a[j]);
printf("\n");
for(int j=0;j<k2;j++)
printf("%d ",b[j]);
printf("\n");*/
dfs(0,0,0,0);
}
printf("%d\n",num);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/44725777