codevs 1983 等式问题 dfs

codevs 1983 等式问题 dfs

  • 传送门:http://codevs.cn/problem/1983/

  • 先构造一个数组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 

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;
}

你可能感兴趣的:(算法学习)