2,有一对小老鼠,出生一周后长成一对大老鼠,两周后出生第一对小老鼠,自己变成一对大老鼠,上周的小老鼠变成了大老鼠,此时共有三对老鼠。试编制程序,计算N周后有多少对老鼠?
5 个解决方案
#1
第2题:斐波那契数列
#2
第一题网搜,嗯
#3
这是数据结构的题目,用栈就能算出。
#4
1) 直接搜索,本身状态比较少
2) 菲波数列,这个增长很快,N大一点就会超过32位,
#define WOLF (1<<2)
#define SHEEP (1<<1)
#define CAB (1<<0)
#define ALL (WOLF|SHEEP|CAB)
const int mv[]={0,CAB,SHEEP,WOLF};
const char *name[]={"empty","cabbage","sheep",0,"wolf"};
int vis[2][20],path[100],maxd;
inline int bitct(int k) { return !k ? 0 : (k&1)+bitct(k>>1); }
inline bool eat(int s){return s==6||s==3;}
bool dfs(int d,int s){
if(!(d&1)&&s==0) return true;
int h =bitct(d&1 ? s^ALL : s);
if(d+1+(h-1)*2>maxd) return false;
for(int i=0;i<4;i++){
if(!mv[i]||(s&mv[i])){
s^=mv[i];
if(!vis[d&1][s]&&!eat(s)){
vis[d&1][s] =1;
path[d] =mv[i];
if(dfs(d+1,s^ALL)) return true;
vis[d&1][s] =0;
}
s ^=mv[i];
}
}
return 0;
}
void river(){
for(maxd=1;;maxd+=2){
memset(vis,0,sizeof vis);
if(dfs(0,ALL)) break;
}
for(int i=0;i<maxd;i++){
printf("%d takes %s\n",i+1,name[path[i]]);
}
}
int main(void)
{
river();
return 0;
}
2) 菲波数列,这个增长很快,N大一点就会超过32位,
int fib(int n){
if(n<2) return 1;
return fib(n-1)+fib(n-2);
}
#5
向4楼学习。
#1
第2题:斐波那契数列
#2
第一题网搜,嗯
#3
这是数据结构的题目,用栈就能算出。
#4
1) 直接搜索,本身状态比较少
2) 菲波数列,这个增长很快,N大一点就会超过32位,
#define WOLF (1<<2)
#define SHEEP (1<<1)
#define CAB (1<<0)
#define ALL (WOLF|SHEEP|CAB)
const int mv[]={0,CAB,SHEEP,WOLF};
const char *name[]={"empty","cabbage","sheep",0,"wolf"};
int vis[2][20],path[100],maxd;
inline int bitct(int k) { return !k ? 0 : (k&1)+bitct(k>>1); }
inline bool eat(int s){return s==6||s==3;}
bool dfs(int d,int s){
if(!(d&1)&&s==0) return true;
int h =bitct(d&1 ? s^ALL : s);
if(d+1+(h-1)*2>maxd) return false;
for(int i=0;i<4;i++){
if(!mv[i]||(s&mv[i])){
s^=mv[i];
if(!vis[d&1][s]&&!eat(s)){
vis[d&1][s] =1;
path[d] =mv[i];
if(dfs(d+1,s^ALL)) return true;
vis[d&1][s] =0;
}
s ^=mv[i];
}
}
return 0;
}
void river(){
for(maxd=1;;maxd+=2){
memset(vis,0,sizeof vis);
if(dfs(0,ALL)) break;
}
for(int i=0;i<maxd;i++){
printf("%d takes %s\n",i+1,name[path[i]]);
}
}
int main(void)
{
river();
return 0;
}
2) 菲波数列,这个增长很快,N大一点就会超过32位,
int fib(int n){
if(n<2) return 1;
return fib(n-1)+fib(n-2);
}
#5
向4楼学习。