用深度优先搜索算法解决USACO 3.3.3 Zero Sum问题

问题描述:输入一个数N,给你三个运算符: ,-,空格;空格表示把两个数连起来比如:“2 3”就等同于23;问你有1到N(N < 9)每个数之间有一个运算符,要你输出所有计算结果为0的情况。解决方案:我

问题描述:

输入一个数N,给你三个运算符: ,-,空格;空格表示把两个数连起来比如:“2 3”就等同于23;问你有1到N(N < 9)每个数之间有一个运算符,要你输出所有计算结果为0的情况。

解决方案:

我们可以使用深度优先搜索算法进行遍历。首先我们定义一个sum变量,存储现有计算出的值,再定义一个left记录扫描到的最后一个数的值,step表示扫描到的数字。递归关系如下图所示:

![]()

判断是否满足条件时别忘了判断时要给sum加left。即sum left0。

代码实现:

```c

include

include

include

include

include

using namespace std;

int N;

int dfs(int sum, int step, int left, string print){

if(stepN){

if(sum left 0){

cout << print << endl;

return 0;

}

else

return 0;

}

if(left<0)

dfs(sum,step 1,left*10-step-1,print ' ' (char)(step 1 '0'));

else

dfs(sum,step 1,left*10 step 1,print ' ' char(step 1 '0'));

dfs(sum left,step 1,step 1,print ' ' char(step 1 '0'));

dfs(sum left,step 1,0-step-1,print '-' char(step 1 '0'));

}

int main(){

freopen("","r",stdin);

freopen("zerosum.out","w",stdout);

scanf("%d",N);

dfs(0,1,1,"1");

return 0;

}

```

本人比较懒,在这道题中没有使用任何优化剪枝,结果运算结果居然只要0ms!!!估计usaco出了点小问题。

标签: