XDOJ-构造表达式

#重点:以两个变量进行dfs,36行AC!#
我终于可以来写表达式了!!!(虽然不知道为什么我这么沉迷于缩短行数)
以三个感叹号来表达我的心情,其实、大概、没有那么想象中的难?
嗯,我找到了做题的最佳办法,有什么是倒头就睡,轻轻松松睡一觉不能解决的呢?(滑稽)推荐大家都试一下。

来讲一下历程叭:这个题一开始有过很多种思路,包括但不限于:

1.利用表格式,二维数组(一开始没注意到还有空格这么个坑,所以应该写不出来?)
2.利用DFS深度优先(算法查工具书最好理解)
3.把所有可能全部列出来,一种一种试(如三进制)

问题描述

给定一个表示序列长度的整数n(3<=n<=9)。在序列1 2 3…n中插入‘+’,‘-’,‘ ’构造表达式,插入‘
’表示前后两个数字构成一个整数,例如1 2 -3 -4 -5=0。
输出构造的所有表达式中,结果为0的表达式的数量,例如n=3时,只有表达式1+2-3=0,输出结果为1。

输入说明

输入数据为一个整数n(n<10),表示序列长度,同时表示输入序列为“1 2 3…n”。

输出说明

对于每一组数据,输出一个整数,表示构造的表达式中结果为0的表达式数量。

输入样例

3

输出样例

1

我极力推荐的代码: (没有比这更简单的了,没有尝试过,开个玩笑嘻嘻)

#include
int main(){
     
	int a[9]={
     0,0,1,1,1,1,6,10,11};
	int n;
	scanf("%d",&n);
	printf("%d",a[n]);
} 

我的真正代码:(注解在代码下方)

#include
int n,count=0; //n是题目要求输入的、count是用来计数的 
int a[9]={
     1,2,3,4,5,6,7,8,9};
int b[10]={
     0};//找到命令 

void dfs(int num,int space){
     
	int i,j,m,temp,sum;
	b[space]=num;//对每一个地方位置记录下选择 
	if(space==n-1){
     //走到了最深处了 
		sum=0;
		for(j=0,m=0;j<=space;j++){
     //计算最后得到的sum 
			if(b[j]==1){
     //这里只写了两种,就是+和-,原因如上。 
				temp=a[m];
				for(i=1;b[j+i]==3;i++)	temp=temp*10+a[m+i];
				sum+=temp;
				m=m+i;	
			}
			if(b[j]==2){
     
				temp=a[m];
				for(i=1;b[j+i]==3;i++)	temp=temp*10+a[m+i];
				sum-=temp;
				m=m+i;
			}
		}
		if(sum==0)	count++;				
		return;
	}
	for(i=1;i<=3;i++)	dfs(i,space+1);    	                                            
}
int main(){
     
	int k;
	scanf("%d",&n);
	dfs(1,0);
	printf("%d",count);
}/*我的num是用来记录1,2,3的*/

关于代码的理解:

数字1:代表“+”;
数字2:代表“-”;
数字3:代表“ ”;

我使用的dfs中,其实一共记录了三个空位(以n=3时为例)比如1 1 1 ,表示的是自0开始时的0_1_2_3中间的三个空格。因此输入进去第一位的空位永远是+(也就是1)那么我在最后进行计算的时候,便可以只写两种:+、-。

关于在dfs中,我只用到了两个变量:n被设置为了全局变量,在我们输入进去之后就可以不再发生变动,而我对于计算sum也是等到遍历到最深处才开始进行计算。所以不需要使用这两个量。dfs中的两变量:

  1. num表示是+、- 还是空格。
  2. space则是b[space]用来计数数组下标。

你可能感兴趣的:(C语言,c语言)