这是一个很经典的问题,关于商人过河的问题,有兴趣的可以试一试
有n名商人各带m名仆人要过河,但船最多只能载二人,商人已获知仆人的阴谋:在河的任一岸,只要仆人数超过商人数,仆人会将商人杀死并且窃取货物,安排如何乘船,商人才能安全过河,
我的思路:
用向量表示该过程:
岸上:
——>过河
|
(商人数,仆人数)——>(商人数,仆人数)
船上的:
(商人数',仆人数')
n:是过河次数。
(商人数,仆人数)+ (商人数',仆人数')=(商人数,仆人数)
------------------------------------- ----------------
| |
^ ^
过河 过河后在岸上
因此用函数替归的方法。
这是我写的程序:
#include<stdio.h>
#include<math.h>
void moveit(long n,long mer,long per,long k)
{
long i,j, k0,i1,j1;
static long array[1000][2];
if (n % 2 != 0)
if (mer==0 && per==0)
for (i1=0;i1 < k+1;i1++)
printf("(%ld,%ld)\n",array[k][0],array[k][1]);
if (mer>0 && per>0)
if (mer>=per)
{
for (i=0;i<3;i++)
for (j=0;j<3;j++)
{
array[k][0]=mer+pow(-1,n)*i;
array[k][1]=per+pow(-1,n)*j;
moveit(n++,mer,per,k++);
}
}
}
main()
{
long mer,per,n,k;
n=1;
k=0;
printf("please input the number of merchants\n");
scanf("%d",&mer);
printf("please input the number of pervonts\n");
scanf("%d",&per);
moveit( n,mer,per,k);
}
本想输出的结果依次为(array[][0],array[][1])的形式
但输出后无任何信息