目前csp水平也就180分,深深的感觉到自己能力的不足,希望从今天开始正式记录每次练题的笔记,从而达到自己的目标。
![](https://img-blog.csdnimg.cn/img_convert/c35d8b25489509c660ade10060e9edbf.png)
#include<iostream>
using namespace std;
const int N=20;
int n;
int arr[N];
//x 表示当前搜索的位置 sum 表示当前搜索积累的总和
void dfs(int x,int sum){
//9.可以进行剪枝操作,加快递归的速率
if (sum>n){
return ;
}
//7.递归的终止条件:递归到第十个位置就停止
if(x>10){
//8.输出的条件:sum==n
if(sum==n){
for(int i=1;i<=10;i++){
printf("%d",arr[i]);
}
printf("\n");
}
return ;
}
//3.递归三种可能性
for(int i=1;i<=3;i++){
//4.用arr数组记录当前递归的值
arr[x]=i;
//5.继续向下递归
dfs(x+1,sum+i);
//6.恢复现场
arr[x]=0;
}
}
int main(){
int sum=0;
//1.输入
scanf("%d",&n);
//2.从第一个位置开始枚举,同时记录枚举当前位置系列的arr[]的总和sum(说白了sum的作用就是结束递归的作用)
dfs(1,sum);
return 0;
}
debug
scanf("%d",&n); 输入这条语句中的&n前面的&不要忘了,否则会编译成功但是没有输出
当答案提示清一色的scanf和printf出错的时候,马上就要反应过来是不是没有包含stdio头文件
30分的答案(还是没有熟练掌握stdio)
一般看到答案是矩阵输出的形式的话马上想到用二位数组来输出
#include<iostream>
#include<stdio.h>
using namespace std;
int n;
const int N=200;
int arr[N];
int mem[10086][10086];
int res=0;
void dfs(int x, int sum){
if(sum>n){
return ;
}
if (x>10){
if(sum==n){
res++;
for(int i=1;i<=10;i++){
mem[res][i]=arr[i];
}
}
return ;
}
for(int i=1;i<=3;i++){
arr[x]=i;
dfs(x+1,sum+i);
arr[x]=0;
}
}
int main(){
int sum=0;
scanf("%d",&n);
dfs(1,sum);
printf("%d\n",res);
for(int i=1;i<=res;i++){
for(int j=1;j<=10;j++){
printf("%d ",mem[i][j]);
}
printf("\n");
}
return 0;
}
60分改进
for(int i=1;i<=res;i++){
for(int j=1;j<=10;j++){
printf("%d ",mem[i][j]); //就在%d后面加了个空格
}
printf("\n");
满分题解
这就告诉我们二维数组还是不要随便开多大
int mem[59055][N];