版权声明:个人水平有限,表述不当或疏漏之处欢迎读者提问交流,共同进步! 作者:J__Max 非商业转载请注明出处,商业转载请联系作者获得授权。 https://blog.csdn.net/J__Max/article/details/83338446
codevs 1983 等式问题 dfs
-
先构造一个数组arr,其中arr[ i ][ j ]表示从第 i 位到第 j 位构成的数字,例如:arr[ 1 ][ 3 ] = 123 。然后在该数组上进行dfs即可
-
其中要注意的一点是:题目中指明第一个数字前没有空格,所以dfs的第一步没有减号的情况
-
具体代码如下:
//
// main.cpp
// progress
//
// Created by J__Max on 2018/10/19.
// Copyright © 2018年 J__Max. All rights reserved.
//
#include <iostream>
using namespace std;
int arr[11][11];
int n,ans;
//初始化arr数组,arr[i][j]表示从第 i 位到第 j 位构成的数字
void init(){
for(int i=1; i<=9; i++){
arr[i][i] = i;
}
for(int i=1; i<=9; i++){
for(int j=i+1; j<=9; j++){
arr[i][j] = arr[i][j-1] * 10 + arr[j][j];
}
}
}
//进行深搜,参数sum表示当前路径下得到的和,参数l表示深搜到第几位数字
void dfs(int sum, int l){
if(l == 10){ //深搜结束,判断和是否满足要求,后进行返回
if(sum == n){
ans++;
}
return ;
}
if(l == 1){ //特判dfs的第一步,这时没有减的情况
for(int i=1; i<=9; i++)
if(i >= l){
dfs(sum + arr[l][i], i+1);
}
}
else{ //dfs,考虑加号和减号的两种情况
for(int i=1; i<=9; i++){
if(i >= l){
dfs(sum + arr[l][i], i+1);
dfs(sum - arr[l][i], i+1);
}
}
}
return ;
}
void solve(){
init();
cin >> n;
dfs(0, 1);
cout << ans << endl;
}
int main(int argc, const char * argv[]) {
solve();
return 0;
}