(综合)P2089 烤鸡
2024-09-01 00:26:27
题解:
错误的:
#include<stdio.h>
int n,ret=0,a[10000][10];
int p(int c,int s){
int i;
for(i=1;i<=3;i++){
s+=i;
if(c==9){
if(s==n){
a[ret][c]=i;
ret++;
return 1;
}else{
s-=i;
continue;
}
}else{
if(p(c+1,s)){
a[ret-1][c]=i;
return 1;
}
}
}
}
int main()
{
int i,j;
scanf("%d",&n);
if(n>30&&n<10){
printf("0");
}else{
int b=p(0,0);
}
printf("%d\n",ret);
for(i=0;i<ret;i++){
for(j=0;j<10;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
int n,ret=0,a[10000][10];
int p(int c,int s){
int i;
for(i=1;i<=3;i++){
s+=i;
if(c==9){
if(s==n){
a[ret][c]=i;
ret++;
return 1;
}else{
s-=i;
continue;
}
}else{
if(p(c+1,s)){
a[ret-1][c]=i;
return 1;
}
}
}
}
int main()
{
int i,j;
scanf("%d",&n);
if(n>30&&n<10){
printf("0");
}else{
int b=p(0,0);
}
printf("%d\n",ret);
for(i=0;i<ret;i++){
for(j=0;j<10;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
可惜的是这个递归出来只有一个解,之后将返回值去掉,进入函数时存放数据,满足一次就拷贝数据至下一行数组中,继续循环。这样弄有点繁琐。
简单点的话,其实可以用一个一维数组来测试组合,符合时就将这组数拷贝到二维数组中。
int c[10000][10],b[10];
void p(int total,int a){
int i,j;
if (a==10){
if (total==n) {
for ( j=0;j<10;j++) c[ret][j]=b[j];//符合要求存起来~~
ret++;
}
}
else if (total>=n) ;//小小优化一下
else
for ( i=1;i<=3;i++){
b[a]=i;
p(total+i,a+1);//其实这和十连for没什么区别。。。
}
}
void p(int total,int a){
int i,j;
if (a==10){
if (total==n) {
for ( j=0;j<10;j++) c[ret][j]=b[j];//符合要求存起来~~
ret++;
}
}
else if (total>=n) ;//小小优化一下
else
for ( i=1;i<=3;i++){
b[a]=i;
p(total+i,a+1);//其实这和十连for没什么区别。。。
}
}
网上说正解是搜索,歪解是枚举,枚举两遍即可完成,说实话咱也想过要枚举,一是觉得有点简单,二是觉得可能会算法复杂度太高,结果是不高。。。
最新文章
- 使input文本框随其中内容而变化长度的方法
- 在apache中设置访问目录后进入的默认页面为index.php
- LeetCode Count of Smaller Numbers After Self
- nginx添加镜像缓存 proxy_store(未完待续)
- JavaScript构建(编绎)系统大比拼:Grunt vs. Gulp vs. NPM
- setjmp和longjmp的使用
- 浏览器插件-ActiveX
- opencv中的图像区域复制
- angular $location常用方法使用
- 《我是一只IT小小鸟》 读后感
- Delphi VMT的前世今生(研究一下D7的VMT表结构)
- Sass与Compress实战:第八章
- python学习(七)
- 我的日志分析之道:简单的Web日志分析脚本
- Alice and Bob(博弈)
- 一,Android Studio笔记
- 二叉树的前序、中序、后序遍历 python
- 爬虫入门【10】Pyspider框架简介及安装说明
- SPOJ - BALNUM 数位dp
- Day3-Python基础3--函数参数及调用