//上面的代码有局限性
int c[14]
int**C=&c;
int*Csize=&csize;
//局限性
*(*C+*CSize)=14;//这句话报错
在这里是不能往数组存东西的有保护,而下面改成动态数组就好了
//上面的代码无局限性
int *c=(int*)malloc(sizeof(int)*14);
int**C=&c;
int*Csize=&csize;
//局限性
*(*C+*CSize)=14;//这句话成功修改
这个问题是在打hanota遇到的
//给的接口很奇怪,因为黑盒子里面有可能BC它没有搞数组,所以我们要自备数组
//*C[*CSize++]=A[--ASize];这句话报错,数组保护
#include<stdio.h>
#include<stdlib.h>
static int n=2;
void hanota(int* A, int ASize, int* B, int BSize, int** C, int* CSize){
//首先递归出口
if(ASize==1){
//*C[*CSize++]=A[--ASize];
--n;
*(*C+*CSize)=*(A+n);
*CSize=*CSize+1;
return;
}
else{
hanota(A,ASize-1,*C,*CSize,&B,&BSize);
hanota(A,1,B,BSize,C,CSize);
hanota(B,ASize-1,A,BSize,C,CSize);
}
}
int main(){
int *A=(int*)malloc(sizeof(int)*14);
int *B=(int*)malloc(sizeof(int)*14);
int *c=(int*)malloc(sizeof(int)*14);
int Asize;
int Bsize;
int csize;
scanf("%d",&Asize);
n=Asize;
Bsize=0;
csize=0;
for(int i=0;i<Asize;i++){
scanf("%d",&A[i]);
}
int**C=&c;
int*Csize=&csize;
hanota(A,Asize,B,Bsize,C,Csize);
for(int i=0;i<Asize;i++){
printf("%d ",c[i]);
}
}
思考:上面的代码有问题,
一开始想直接用leetcode提供的接口,然后想黑盒里面可能有也可能没有数组或者动态数组,可能被保护也可能没有被保护;
然后思考如果用n来表示移动的数目,那么这里的参数都是栈的地址和栈顶,这样少一个参数接口;
然后思考,如果用Asize作为n那么Bsize和Csize显然没有什么作用,栈顶不知道怎么传入并且随着对象变化;
上面的代码就是,在B到C最后一步的时候,B的n没有–而A的减少了,要让栈顶随着栈变,之前没有考虑,这样的话这样的参数是没办法实现这个功能的,只能去用对象的思想。具体运行成功代码放到算法专栏。
:我想这才是一个完整的思考过程,而不是仅仅抽离于接口之外的实现。