商人仆人过河问题

问题描述:
商人仆人过河问题,河这边有3个商人和3个仆人,要过河,每次过河最多两个人上船,最少得有一个在船上。
但是岸上的状态,仆人数不能多于商人数,否则仆人会造反杀人灭口,要如何过河才能把河这边的三商人和三
仆人送到对岸上去。

C语言源代码:

#include "stdio.h"
#include "memory.h"

typedef struct State //商人数和仆人数状态结构体
{
int bus; //商人数
int ser; //仆人数
}state;

char flagb[4][4] , flags[4][4]; //状态图标记数组
state method[16]; //记录结构的数组
int cp; //计数变量

bool Judge(state ans) //判断当前状态,满足返回true
{
if (ans.bus==0 || ans.bus>=ans.ser) return true;
else return false;
}
bool isWell(state ans) //判断河对岸状态和河这边状态,都满足返回true
{
state temp = ans;
temp.bus = 3 - temp.bus;
temp.ser = 3 - temp.ser;
if (Judge(temp)&&Judge(ans))return true;
else return false;
}

void print() //打印结果
{
for (int i=0;i<=cp;i++)
{
printf("(%d,%d) ",method[i].bus,method[i].ser);
//if (i<cp)printf("->");
}

printf("\n\n");

}

void Init() //初始化
{
memset(flagb,0,sizeof(flagb)); //标志数组全置0
memset(flags,0,sizeof(flags));
cp = 0;

}

void OverRiver(state now)
{
if (now.bus==3 && now.ser==3)
{
print();
}
else
{

if ( isWell(now) ) //满足条件则继续深度搜索
{
if ((cp%2==0) && (flagb[now.bus][now.ser]==0)) //从河这边到对岸,并且还未走过
{
flagb[now.bus][now.ser] = 1;
if (now.bus <= 1)
{
now.bus = now.bus + 2;
cp++;
method[cp] = now;

OverRiver(now);

now.bus = now.bus - 2;
cp--;
}
if (now.ser <= 1)
{
now.ser = now.ser + 2;
cp++;
method[cp] = now;

OverRiver(now);

now.ser = now.ser - 2;
cp--;
}
if (now.bus<=2 && now.ser<=2)
{
now.ser = now.ser + 1;
now.bus = now.bus + 1;
cp++;
method[cp] = now;

OverRiver(now);

now.ser = now.ser - 1;
now.bus = now.bus - 1;
cp--;
}
if (now.bus<=2)
{
now.bus = now.bus + 1;
cp++;
method[cp] = now;

OverRiver(now);

now.bus = now.bus - 1;
cp--;
}
if (now.ser<=2)
{
now.ser = now.ser + 1;
cp++;
method[cp] = now;

OverRiver(now);

now.ser = now.ser - 1;
cp--;
}
flagb[now.bus][now.ser] = 0;
}
else if((cp%2!=0) && (flags[now.bus][now.ser]==0)) //从河对岸到这边,并且同样未走过
{
flags[now.bus][now.ser] = 1;
if (now.bus >= 2)
{
now.bus = now.bus - 2;
cp++;
method[cp] = now;

OverRiver(now);

now.bus = now.bus + 2;
cp--;
}
if (now.ser >= 2)
{
now.ser = now.ser - 2;
cp++;
method[cp] = now;

OverRiver(now);

now.ser = now.ser + 2;
cp--;
}
if (now.bus>=1 && now.ser>=1)
{


now.ser = now.ser - 1;
now.bus = now.bus - 1;
cp++;
method[cp] = now;

OverRiver(now);

now.ser = now.ser + 1;
now.bus = now.bus + 1;
cp--;
}
if (now.bus>=1)
{
now.bus = now.bus - 1;
cp++;
method[cp] = now;

OverRiver(now);

now.bus = now.bus + 1;
cp--;
}
if (now.ser>=1)
{
now.ser = now.ser - 1;
cp++;
method[cp] = now;

OverRiver(now);

now.ser = now.ser + 1;
cp--;
}
flags[now.bus][now.ser] = 0;
}

}

}
}


int main()
{
Init();
state ori;
ori.bus = 0;
ori.ser = 0;
method[0] = ori;
//printf("%d\n",isWell(ori));
printf("河对岸状态图(商人数,仆人数):\n\n");
OverRiver(ori);
return 0;
}

相关文档
最新文档