主题:有意来编一个这个程序!
scollen
[专家分:50] 发布于 2006-04-26 18:25:00
请大家帮我编个程,告诉我具体一点的算法也行呀.题目如下:商人3个,各带一个随从,随从们约定,在河的任一岸,只是随从人数多于商人就杀人越货.请问商人们怎么过河?
编为程序.求出具体方案.
数学解法为: 设x,y分别为此岸的商人数和随从数.u,v分别人船上商人数和随从数.
S为x,y的允许集合:S{x=0,y=1,2,3,4;x=4,y=1,2,3,4;x=y=1}
D为允许步骤:D={1≤u+v≤2,u,v=0,1,2} 从而也就转化为:Sk+1=Sk+(-1)**(k)*Dk
S从S(4,4)到S(0,0)就算过河.
帮忙编程来算这个问题!
回复列表 (共3个回复)
沙发
2630023 [专家分:100] 发布于 2006-05-08 09:42:00
伙计!写的题目不知道什么意思!
板凳
cuiweican [专家分:160] 发布于 2006-05-10 20:32:00
属于数学建模方面的问题,去找找这方面的书,可能会有思路的
3 楼
scollen [专家分:50] 发布于 2006-05-17 13:59:00
我只能提示一下你:用C语言了,你应该看得懂吧.要改进哦!
#include "stdio.h"
#include "conio.h"
#include "stdio.h"
#include "math.h"
#define NUM 3
int n,m;
void main()
{ int k=1,maze[NUM+1][NUM+1];
int p=NUM;
int q=NUM;
/*满足此岸的人数使得商人将不会被杀的状态为1否则为0*/
for(n=NUM;n>=0;n--) /*此时的n,m表示为n个商人m个随从*/
{
for(m=NUM;m>=0;m--)
{
if (n==0||n==3||n==m)
maze[n][m]=1;
else maze[n][m]=0;
}
}
for(n=0;n<=2;n++) /*此时的n,m表示为商人,随从可渡船的范围*/
{
for(m=0;m<=2;m++)
{
if(p==0&&q==0) break;
else if(maze[p][q]==1&&p<=NUM&&q<=NUM)
{
if((n+m)<=2&&(n+m)>=1)
{
if(k%2!=0)
{
p=p-n;
q=q-m;
printf("the %d times number ofshangren is: %d,suicong:%d\n",k,p,q);
k=k+1; /*k表示第k次渡船数(从此岸到彼岸或从彼岸到此岸为一次)*/
}
if(k%2==0)
{
p=p+n;
q=q+m;
printf("the %d times number ofshangren is: %d,suicong:%d\n",k,p,q);
k=k+1;
}
}
else continue;
}
}
}
getch();
}
我来回复