#重点:以两个变量进行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<stdio.h>
int main(){
int a[9]={0,0,1,1,1,1,6,10,11};
int n;
scanf("%d",&n);
printf("%d",a[n]);
}
我的真正代码:(注解在代码下方)
#include<stdio.h>
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中的两变量:
- num表示是+、- 还是空格。
- space则是b[space]用来计数数组下标。