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