求大神帮忙用c语言编个题目

时间:2022-05-14 14:15:17
1,一个人带着一只羊,一条狼和一颗白菜想过河,假设他每次只能带一只羊,或者一条狼,或者一颗白菜过河,并限定人不在场时,狼和羊,或羊和白菜不能 单独在一起,试编写程序求出他带一只羊,一条狼和一颗白菜过河的办法
2,有一对小老鼠,出生一周后长成一对大老鼠,两周后出生第一对小老鼠,自己变成一对大老鼠,上周的小老鼠变成了大老鼠,此时共有三对老鼠。试编制程序,计算N周后有多少对老鼠?

5 个解决方案

#1


第2题:斐波那契数列

#2


第一题网搜,嗯

#3


这是数据结构的题目,用栈就能算出。

#4


1) 直接搜索,本身状态比较少

#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楼学习。 求大神帮忙用c语言编个题目

#1


第2题:斐波那契数列

#2


第一题网搜,嗯

#3


这是数据结构的题目,用栈就能算出。

#4


1) 直接搜索,本身状态比较少

#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楼学习。 求大神帮忙用c语言编个题目