| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2963 人关注过本帖
标题:商人过河问题,有兴趣的进来编个小程
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵还有人记得我倍感荣幸。如果有人想看,我可以写一篇关于这个问题的分析及代码。不过之前大家先自己想想还是很不错的。

重剑无锋,大巧不工
2014-09-30 15:22
逐鹿
Rank: 2
等 级:论坛游民
帖 子:8
专家分:12
注 册:2014-9-19
收藏
得分:2 
#include "stdio.h"
int method(int i)
{
    switch(i)
    {
    case 0:printf("两商人\n");break;
    case 1:printf("一商人一仆从\n");break;
    case 2:printf("两仆从\n");break;
    case 3:printf("一商人\n");break;
    case 4:printf("一仆从\n");break;
    }
    return 0;
}
int main()
{
    int m=1,s1=3,p1=3,s2=0,p2=0,a[5][2]={2,0,1,1,0,2,1,0,0,1},i=0,n=-1;
    /*m控制过去或回来 s1商人 p1仆人  s2对岸商人  p2对岸仆人  a是可能  n是防止过去回来一样而陷入死循环*/
    while(s2<3||p2<3)
    {
        for(i=0;i<5;i++)
        {
            if(n!=i)
            {
                //printf("i=%d\n",i);
                if(s2+m*a[i][0]>=0&&s2+m*a[i][0]<=3&&p2+m*a[i][1]>=0&&p2+m*a[i][1]<=3)//对岸商人和仆人都应不小于0不大于3
                    if(((s2+m*a[i][0]>=p2+m*a[i][1])||s2+m*a[i][0]==0)&&((s1-m*a[i][0]>=p1-m*a[i][1])||s1-m*a[i][0]==0))//任何一边商人数要大于仆人数或商人数为0
                    {
                                n=i;
                                m>0?printf("过去:"):printf("回来:");
                                s2+=m*a[i][0];p2+=m*a[i][1];
                                s1-=m*a[i][0];p1-=m*a[i][1];
                                method(i);m=-m;break;
                    }                //printf("s1=%dp1=%ds2=%dp2=%dm=%d\n",s1,p1,s2,p2,m);。。。。。这一部分因为我看不懂错误信息,就跟着这几个值改的
            }
        }
    }
}

新手试着写的  有什么不对的 多包涵,,刚看完指针,,,

[ 本帖最后由 逐鹿 于 2014-9-30 17:20 编辑 ]

win8.1+vs2010。。。

灵感源于专注。。。
2014-09-30 17:10
逐鹿
Rank: 2
等 级:论坛游民
帖 子:8
专家分:12
注 册:2014-9-19
收藏
得分:0 
另外怎么得资源分啊   我想下那个  C++ Primer Plus 第5版 中文版  要一资源分

win8.1+vs2010。。。

灵感源于专注。。。
2014-09-30 17:13
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:0 
回复 8 楼 vvvcuu
用算法写出来,三个人肯定自己想想也想出来,写出来就不是那么简单了。要是人比较多呢

Maybe
2014-09-30 17:14
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:0 
回复 11 楼 beyondyf
我看了网上的资料,貌似这题还是很经典的,涉及到不少知识,真该好好学学,强烈支持大哥能对此题进行讲解,晚上自己在想想,还没下班

[ 本帖最后由 邓士林 于 2014-9-30 17:17 编辑 ]

Maybe
2014-09-30 17:16
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 14 楼 邓士林
在主人与仆人相等的前提下三组以上是无解的:-)

重剑无锋,大巧不工
2014-09-30 18:11
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
收藏
得分:0 
诶,思虑不周啊,要是能绑在岸边……那就能过一个仆人就绑一个……这似乎不合题意了……


莫问前尘有愧,但求今生无悔
2014-09-30 21:35
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:0 
#include <stdio.h>
#include<stdlib.h>
 #include <time.h>


    int a[6]={1,1,1,-1,-1,-1};
    int b[6]={0,0,0,0,0,0};
    int ans[1000];

void  initial()
{
    for(int i=0;i<1000;i++)
        ans[i]=0;
}
void printfab()
{
        printf("a=");
    for(int i=0;i<6;i++)
        printf("%d  ",a[i]);
        printf("b=");
    for(i=0;i<6;i++)
        printf("%d  ",b[i]);
    printf("\n");
}


void printfans()
{
    for(int i=0;i<1000;i++)
    {
        if(ans[i]==0)
            break;
        if(ans[i]==1)
            printf("bb->\n");
        if(ans[i]==2)
            printf("ab->\n");
        if(ans[i]==3)
            printf("aa->\n");
        if(ans[i]==4)
            printf("a->\n");
        if(ans[i]==5)
            printf("b->\n");
        if(ans[i]==6)
            printf("<-bb\n");
        if(ans[i]==7)
            printf("<-ab\n");
        if(ans[i]==8)
            printf("<-aa\n");
        if(ans[i]==9)
            printf("<-a\n");
        if(ans[i]==10)
            printf("<-b\n");
    }

}

int judge()
{
    int i;
    int astatus=0,bstatus=0;
    int asum=0,bsum=0;
    for(i=0;i<6;i++)
    {
        if(a[i]==1)  {astatus=1;break;}
    }
    for(i=0;i<6;i++)
    {
        if(b[i]==1)  {bstatus=1;break;}
    }

    for(i=0;i<6;i++)
    {
        asum+=a[i];
        bsum+=b[i];
    }

    if(asum<0&&astatus==1) return 0;
    if(bsum<0&&bstatus==1) return 0;

    return 1;
}

int  success()
{
    int i;
    for(i=0;i<6;i++)
    {
        if(a[i]!=0) break;
    }
    if(i==6) return 1;
    else  return 0;
}


void rightmove1() //a->b(1)
{
    int i;
    for(i=0;i<6;i++)
    {
        if(a[i]==1) {a[i]=0;break;}
    }
    for(i=0;i<6;i++)
    {
        if(b[i]==0) {b[i]=1;break;}
    }
}

void rightmove_1()//a->b(-1)
{
    int i;
    for(i=0;i<6;i++)
    {
        if(a[i]==-1) {a[i]=0;break;}
    }
    for(i=0;i<6;i++)
    {
        if(b[i]==0) {b[i]=-1;break;}
    }
}

void leftmove1()//b->a(1)
{   
    int i;
    for(i=0;i<6;i++)
    {
        if(b[i]==1) {b[i]=0;break;}
    }
    for(i=0;i<6;i++)
    {
        if(a[i]==0) {a[i]=1;break;}
    }
}
void leftmove_1()//b->a(-1)
{   
    int i;
    for(i=0;i<6;i++)
    {
        if(b[i]==-1) {b[i]=0;break;}
    }
    for(i=0;i<6;i++)
    {
        if(a[i]==0) {a[i]=-1;break;}
    }
}

int num1ofa()
{
    int i,sum=0;
    for(i=0;i<6;i++) {if(a[i]==1) sum++;}
    return sum;
}

int num_1ofa()
{
    int i,sum=0;
    for(i=0;i<6;i++) {if(a[i]==-1) sum++;}
    return sum;
}
int num1ofb()
{
    int i,sum=0;
    for(i=0;i<6;i++) {if(b[i]==1) sum++;}
    return sum;
}

int num_1ofb()
{
    int i,sum=0;
    for(i=0;i<6;i++) {if(b[i]==-1) sum++;}
    return sum;
}

int move(int i)
{//1 商 //-1 仆
    if(i==1) //(-1,-1 )->
    {
        if(num_1ofa()>=2) {    rightmove_1(); rightmove_1(); return 1;}
        else  return 0;
    }
    if(i==2) //(1 ,-1)->
    {
        if(num1ofa()>=1&&num_1ofa()>=1) {    rightmove1(); rightmove_1();  return 1;}
        else  return 0;
    }
    if(i==3) //(1,1) ->
    {
        if(num1ofa()>=2) {     rightmove1(); rightmove1(); return 1;}
        else  return 0;
    }
    if(i==4) //(1 )->
    {
        if(num1ofa()>=1) {       rightmove1();return 1;}
        else  return 0;
    }
    if(i==5) //(-1 )->
    {
        if(num_1ofa()>=1) {      rightmove_1();  return 1;}
        else  return 0;
    }
    if(i==6) //<- ( -1,-1)
    {
        if(num_1ofb()>=2) {    leftmove_1(); leftmove_1(); return 1;}
        else  return 0;
    }
    if(i==7) //<-  ( 1 ,-1)
    {
        if(num1ofb()>=1&&num_1ofb()>=1) {leftmove1(); leftmove_1();return 1;}
        else  return 0;
    }
    if(i==8) //<-  (1 , 1)
    {
        if(num1ofb()>=2) {leftmove1(); leftmove1(); return 1;}
        else  return 0;
    }
    if(i==9) //<-   ( 1)
    {
        if(num1ofb()>=1) {    leftmove1(); return 1;}
        else  return 0;
    }
    if(i==10)//<-    (-1)
    {
        if(num_1ofb()>=1) { leftmove_1(); return 1;}
        else  return 0;
    }
    return 0;
}



int main()
{   
    int m=0;
    int k;
    initial();
     srand( (unsigned)time( NULL ) );

    int turn=1;  // 1表示正向 0 表示反向

    while(1)
    {
        if(success()) break;
        if(turn) k=rand()%5+1;
        else     k=rand()%5+6;
         if(move(k))
         {
             turn = !turn;
              ans[m++]=k; printf("m=%d ",m);printf("k=%d ",k);printfab();
   
         }

    }

    printf("\n");


    return 0;
}

2014-09-30 22:19
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:0 
不好意思 有个条件judge没有用上
再来一次
#include <stdio.h>
#include<stdlib.h>
 #include <time.h>


    int a[6]={1,1,1,-1,-1,-1};
    int b[6]={0,0,0,0,0,0};
    int ans[1000];

void  initial()
{
    for(int i=0;i<1000;i++)
        ans[i]=0;
}
void printfab()
{
        printf("a=");
    for(int i=0;i<6;i++)
        printf("%d  ",a[i]);
        printf("b=");
    for(i=0;i<6;i++)
        printf("%d  ",b[i]);
    printf("\n");
}


void printfans()
{
    for(int i=0;i<1000;i++)
    {
        if(ans[i]==0)
            break;
        if(ans[i]==1)
            printf("bb->\n");
        if(ans[i]==2)
            printf("ab->\n");
        if(ans[i]==3)
            printf("aa->\n");
        if(ans[i]==4)
            printf("a->\n");
        if(ans[i]==5)
            printf("b->\n");
        if(ans[i]==6)
            printf("<-bb\n");
        if(ans[i]==7)
            printf("<-ab\n");
        if(ans[i]==8)
            printf("<-aa\n");
        if(ans[i]==9)
            printf("<-a\n");
        if(ans[i]==10)
            printf("<-b\n");
    }

}

int judge()
{
    int i;
    int astatus=0,bstatus=0;
    int asum=0,bsum=0;
    for(i=0;i<6;i++)
    {
        if(a[i]==1)  {astatus=1;break;}
    }
    for(i=0;i<6;i++)
    {
        if(b[i]==1)  {bstatus=1;break;}
    }

    for(i=0;i<6;i++)
    {
        asum+=a[i];
        bsum+=b[i];
    }

    if(asum<0&&astatus==1) return 0;
    if(bsum<0&&bstatus==1) return 0;

    return 1;
}

int  success()
{
    int i;
    for(i=0;i<6;i++)
    {
        if(a[i]!=0) break;
    }
    if(i==6) return 1;
    else  return 0;
}


void rightmove1() //a->b(1)
{
    int i;
    for(i=0;i<6;i++)
    {
        if(a[i]==1) {a[i]=0;break;}
    }
    for(i=0;i<6;i++)
    {
        if(b[i]==0) {b[i]=1;break;}
    }
}

void rightmove_1()//a->b(-1)
{
    int i;
    for(i=0;i<6;i++)
    {
        if(a[i]==-1) {a[i]=0;break;}
    }
    for(i=0;i<6;i++)
    {
        if(b[i]==0) {b[i]=-1;break;}
    }
}

void leftmove1()//b->a(1)
{   
    int i;
    for(i=0;i<6;i++)
    {
        if(b[i]==1) {b[i]=0;break;}
    }
    for(i=0;i<6;i++)
    {
        if(a[i]==0) {a[i]=1;break;}
    }
}
void leftmove_1()//b->a(-1)
{   
    int i;
    for(i=0;i<6;i++)
    {
        if(b[i]==-1) {b[i]=0;break;}
    }
    for(i=0;i<6;i++)
    {
        if(a[i]==0) {a[i]=-1;break;}
    }
}

int num1ofa()
{
    int i,sum=0;
    for(i=0;i<6;i++) {if(a[i]==1) sum++;}
    return sum;
}

int num_1ofa()
{
    int i,sum=0;
    for(i=0;i<6;i++) {if(a[i]==-1) sum++;}
    return sum;
}
int num1ofb()
{
    int i,sum=0;
    for(i=0;i<6;i++) {if(b[i]==1) sum++;}
    return sum;
}

int num_1ofb()
{
    int i,sum=0;
    for(i=0;i<6;i++) {if(b[i]==-1) sum++;}
    return sum;
}

int move(int i)
{//1 商 //-1 仆
    if(i==1) //(-1,-1 )->
    {
        if(num_1ofa()>=2)
        {
            rightmove_1(); rightmove_1();
            if(judge())    return 1;
            else  {leftmove_1(); leftmove_1(); return 0; }
        }
        else  return 0;
    }
    if(i==2) //(1 ,-1)->
    {
        if(num1ofa()>=1&&num_1ofa()>=1)
        {    rightmove1(); rightmove_1();  
        if(judge())return 1;
        else {leftmove1(); leftmove_1(); return 0;}
        }
        else  return 0;
    }
    if(i==3) //(1,1) ->
    {
        if(num1ofa()>=2)
        {
            rightmove1(); rightmove1();
            if(judge())return 1;
            else {leftmove1(); leftmove1(); return 0;}
        }
        else  return 0;
    }
    if(i==4) //(1 )->
    {
        if(num1ofa()>=1) {       rightmove1();
        if(judge()) return 1;
        else {leftmove1(); return 0;}
        }
        else  return 0;
    }
    if(i==5) //(-1 )->
    {
        if(num_1ofa()>=1) {      rightmove_1();  
        if(judge())    return 1;
            else {leftmove_1(); return 0;}
        }
        else  return 0;
    }
    if(i==6) //<- ( -1,-1)
    {
        if(num_1ofb()>=2) {    leftmove_1(); leftmove_1();
        if(judge())        return 1;
        else {    rightmove_1(); rightmove_1(); return 0;}
        }
        else  return 0;
    }
    if(i==7) //<-  ( 1 ,-1)
    {
        if(num1ofb()>=1&&num_1ofb()>=1) {leftmove1(); leftmove_1();
        if(judge())     return 1;
        else {    rightmove1(); rightmove_1();  return 0;}
        }
        else  return 0;
    }
    if(i==8) //<-  (1 , 1)
    {
        if(num1ofb()>=2) {leftmove1(); leftmove1();
            if(judge())     return 1;
            else {        rightmove1(); rightmove1(); return 0;}
        }
        else  return 0;
    }
    if(i==9) //<-   ( 1)
    {
        if(num1ofb()>=1) {    leftmove1();
        if(judge())         return 1;
        else {rightmove1(); return 0;}
        }
        else  return 0;
    }
    if(i==10)//<-    (-1)
    {
        if(num_1ofb()>=1) { leftmove_1();
        if(judge())         return 1;
        else { rightmove_1();  return 0;}
        }
        else  return 0;
    }
    return 0;
}





int main()
{   
    int m=0;
    int k;
    initial();
     srand( (unsigned)time( NULL ) );

    int turn=1;  // 1表示正向 0 表示反向

    while(1)
    {
        if(success()) break;
        if(turn) k=rand()%5+1;
        else     k=rand()%5+6;
         if(move(k))
         {
             if(judge()==0)
             {
                 if(k<=5)
                 move(k+5);
                 else
                 move(k-5);
             }
             turn = !turn;
              ans[m++]=k; printf("m=%d ",m);printf("k=%d ",k);printfab();
   
         }

    }

    printf("\n");


    return 0;
}

2014-09-30 22:48
erty1001
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:331
专家分:1433
注 册:2014-8-31
收藏
得分:0 
再补充 一下

主函数里面的while直接是这样

   while(1)
    {
        if(success()) break;
        if(turn) k=rand()%5+1;
        else     k=rand()%5+6;
         if(move(k))
         {
                 turn = !turn;
              ans[m++]=k; printf("m=%d ",m);printf("k=%d ",k);printfab();
   
         }

    }
2014-09-30 22:53
快速回复:商人过河问题,有兴趣的进来编个小程
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020961 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved