P2089 烤鸡

康复训练的第一道搜索

调了一个小时,这是原来的代码

#include <iostream>
#include <cstring>
using namespace std;

int n;
int ans[500][11], count;

void dfs(int step, int sum) {
    if (step > 10 || sum <= 0) {
        return;
    }
    if (step == 10 && sum <= 3) {
        ans[count][step] = sum;
        count++;
        return;
    }
    for (int i = 1; i < sum; i++) {
        ans[count][step] = i;
        dfs(step + 1, sum - i);
    }
    return;
}

int main() {
    cin >> n;
    dfs(1, n);
    cout << count << endl;
    for (int i = 0; i < count; i++) {
        for (int j = 1; j <= 10; j++) {
            cout << ans[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

除了内存开小了以外有一个大问题,出在存答案的数组上。 我的方案数都对,案例输出2的位置也都对,但很多地方不是1而是0,即数组的默认值。

我想了很久,觉得这些地方根本没被赋值,count++之后,本应该作为前面答案的数列只赋值给了原来的count那一维。

我的解决方案是再开一个temp数组,专门存储一个count内的有效答案,再把整个temp赋给ans。这是AC代码。

/*********************************************************************
    程序名:
    版权:
    作者:
    日期: 2023-10-07 16:58
    说明:
*********************************************************************/
#include <iostream>
#include <cstring>
using namespace std;

int n;
int temp[11], count;
int ans[20100][11];

void dfs(int step, int sum) {
    if (step > 10 || sum <= 0) {
        return;
    }
    if (step == 10 && sum <= 3) {
        temp[10] = sum;
        for (int i = 1; i <= 10; i ++) {
            ans[count][i] = temp[i];
        }
        count++;
        return;
    }

    for (int i = 1; i <= 3; i++) {
        temp[step] = i;
        dfs(step + 1, sum - i);
    }
    return;
}

int main() {
    cin >> n;
    dfs(1, n);
    cout << count << endl;
    for (int i = 0; i < count; i++) {
        for (int j = 1; j <= 10; j++) {
            cout << ans[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}
posted @ 2023-10-07 18:06  加固文明幻景  阅读(9)  评论(0)    收藏  举报  来源