什么?好久没见到我了?
是啊 好久 没写博客了
但是 很快马上也就是现在 我 回来了!
usaco列表 的搜索 被我写的如此煎熬
戳
大致题意:
添加:
+ 两数相加
-两数相减
.把相邻两个看成一个
三种符号
是的 1 2 3 。。。。。n计算结果为0
其实想的挺清楚的,类似三叉树吗,dfs
但是 一到‘.’就老想不清楚
还是代码能力太弱
其实 一直不会的就是 一堆连一块
担心什么解决什么吗
把你之前计算进去的减掉不就ok了嘛
ps 回溯 记着return不然 。。环了
#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
int n,x,cnt;
char op[16];
void print()
{
for(int i=1;i<=n-1;i++)
{
printf("%lld %c ",i,op[i]);
}
printf("%lld\n",n);
}
void dfs(int sum,int t,int p)
{
if(t == n)
{
if(sum == 0)
{
++cnt;
if(cnt<=20)
{
print();
}
}
return; //!!!!
}
int next=0;
//+
op[t]='+';
dfs(sum+t+1,t+1,t+1);
//-
op[t]='-';
dfs(sum-t-1,t+1,t+1);
//.
op[t]='.';
if(t<9)
{
next=p*10+t+1;
}
else
{
next=p*100+t+1;
}
int k=t-1;
while(op[k] == '.') k--;
if(op[k] == '+')
{
dfs(sum-p+next,t+1,next);
}
else if(op[k] == '-')
{
dfs(sum+p-next,t+1,next);
}
}
signed main()
{
scanf("%lld",&n);
op[0]='+';
dfs(1,1,1);
printf("%lld\n",cnt);
return 0;
}