零点问题 解题报告

零点问题 解题报告_第1张图片

别管最上面那一堆东西。。

【解题思路】

这道题用搜索不难想到。每一次只需要扩展状态,枚举每一个空位是' ','+','-'中的哪一个就行了,为了方便刚开始可以用123来表示;

这样我们每一次可以生成一个合格的表达式,,然后就把表达式求值就可以了,求值的过程有点繁琐,但是难度并不大。

【数据分析】范围是3~9暴搜没有问题。

【代码】

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[100],b[100],num[100],f[100];
int i,n;

int jiajian(int a,int b,int c)
{
	if (c==2) return a+b;
	if (c==3) return a-b;
}

void sum()//表达式的求值和输出,,其他的做法也都可以。。
{
	int j=0,k=0,l=0,s=0;
	memset(num,0,sizeof(num));
	memset(f,0,sizeof(f));
	while (j<n)
	{
		j++;
		l++;
		num[l]=a[j];
		f[l]=b[j];
		k=0;
		while (f[l]==1)
		{
			k++;
			num[l]=num[l]*10+a[j+k];
			f[l]=b[j+k];
		}
		j+=k;
	}
	s=num[1];
	for (j=1;j<l;++j)
	  s=jiajian(s,num[j+1],f[j]);
	if (s==0)
	{
		for (j=1;j<n;++j)
		{
			printf("%d",a[j]);
			if (b[j]==2) printf("+");
			if (b[j]==3) printf("-");
			if (b[j]==1) printf(" ");
		}
		printf("%d\n",a[n]);
	}
}

void dfs(int dep)
{
	int r;
	if (dep==n)
	{
		sum();
		return;
	}
	for (r=1;r<=3;++r)//枚举三种情况
	{
		b[dep]=r;
		dfs(dep+1);
	}
}

int main()
{
	freopen("zerosum.in","r",stdin);
	freopen("zerosum.out","w",stdout);
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	scanf("%d",&n);
	for (i=1;i<=n;++i)
	  a[i]=i;//数字必须连续
	dfs(1);
	return 0;
}


你可能感兴趣的:(搜索与回溯)