洛谷P2089 烤鸡
可以用暴力循环十层
(此处用深搜) 下面两个代码有不同,具体领悟, 上面的代码一定要在前面加“if(u>10)return;” 不然会爆栈
#include<stdio.h>
int d[10000][11],a[11];
int sum=0,cnt = 0;
int n;
void pp(){
for(int i=1; i<=n; i++){
d[cnt][i] = a[i];
}
cnt++;
}
void dfs(int u){
if(u>10)return;
for(int i=1; i<=3; i++){
sum += i;
a[u] = i;
if(u==10&&sum==n)pp();
else dfs(u+1);
sum -= i;
}
}
int main(){
scanf("%d",&n);
dfs(1);
printf("%d\n",cnt);
for(int i=0; i<cnt; i++){
for(int j=1; j<=10; j++){
printf("%d ",d[i][j]);
}
printf("\n");
}
return 0;
}
参考版本,洛谷解题
#include<iostream>
using namespace std;
int s,t,n;
int a[11];
int b[10000][11];//一个二维数组,先出方案总数很难做呀
int c=1;
int num;
void ss(int k);
void pp();
int main() {
cin>>n;
ss(1);
cout<<num<<endl;
for(int i=1; i<c; i++) {
for(int j=1; j<=10; j++) {
cout<<b[i][j]<<" ";
}
cout<<endl;
}
}
void ss(int k) {
for(int i=1; i<=3; i++){ //每个只能加1,或2或3
s+=i;
a[k]=i;
if(k==10) {
if(s==n)pp();
} else ss(k+1);
s-=i;//回溯
}
}
void pp() {
num++;
for(int i=1; i<=10; i++)
b[c][i]=a[i];//存数组
c++;
}