#include <stdioh>
#include <malloch>
#include <conioh>
/回溯法解决
基本构架
while(){
do{
\\\\\\\
}while(检查是符合格)
if(x[k-1]<=n)
{
if(满足条件){}
else {下一步}
}
else{回溯,尝试下一位置}
}
}/
int a=3,b=3;
//chacuo()中运人两岸需满足商>仆
//注意0商<N仆的现象
int chacuo(int i,int k,int x[])
{
//运两个商人
if(x[k-1]==1)
{
if(i%2==0) {
if(a>=2)
{
if(((a-2)!=0 && a-2<b)||(5-a)<(3-b)) {return -1;}
a=a-2;
}
else return -1;
}
else {
if(a<=1)
{if((a+2<b)||((1-a)!=0&&(1-a)<(3-b))){return -1;}
a=a+2;
}
else return -1;
}
}
//运一个商人
if(x[k-1]==2)
{
if(i%2==0) {
if(a>=1){
if(((a-1)!=0&&a-1<b)||(2-a)<(3-b)){return -1;}
a=a-1;
}
else return -1;
}
else {
if(a<=2){
if((a+1<b)||((2-a)!=0 &&(2-a)<(3-b))){return -1;}
a=a+1;
}
else return -1;
}
}
//运一个仆人
if(x[k-1]==3)
{
if(i%2==0) {
if(b>=1){
if((a!=0&&a<b-1)||((3-a)!=0&&(3-a)<(4-b))){return -1;}
b=b-1;
}
else return -1;
}
else {
if(b<=2)
{
if((a!=0&&a<b+1)||((3-a)!=0&&(3-a)<(2-b))){return -1;}
b=b+1;
}
else return -1;
}
}
//运两个仆人
if(x[k-1]==4)
{
if(i%2==0) {
if(b>=2){
if((a!=0&&a<b-2)||((3-a)!=0&&(3-a)<(5-b))){return -1;}
b=b-2;
}
else return -1;
}
else {
if(b<=1){
if((a!=0&&a<b+2)||((3-a)!=0&&(3-a)<(1-b))){return -1;}
b=b+2;
}
else return -1;
}
}
//运一商一仆
if(x[k-1]==5)
{
if(i%2==0) {
if(a>=1&&b>=1){
if(((a-1)!=0&&a-1<b-1)||(4-a)<(4-b)){return -1;}
a--;b--;
}
else return -1;
}
else {
if(a<=2&&b<=2){
if((a+1<b+1)||((2-a)!=0&&(2-a)<(2-b))){return -1;}
a++;b++;
}
else return -1;
}
}
return 1;
}
//显示
void print(int x[])
{
int i;
for(i=0;x[i]!=0;i++)
{
if((i%2)==0)printf(" 去-->");
else printf(" 返<--");
if(x[i]==1)printf("2商人");
if(x[i]==2)printf("1商人");
if(x[i]==3)printf("1仆人");
if(x[i]==4)printf("2仆人");
if(x[i]==5)printf("1商人1仆人");
}
printf("\n");
}
主函数部分,框架给你了,你动动脑子,自己写吧
#include <stdioh>
#include <stdlibh>
#include <stringh>
#define MAX_STEP 20
//index: 0 - 狼,1-羊,2-菜,3-农夫,value:0-本岸,1-对岸
int a[MAX_STEP][4];
int b[MAX_STEP];
char name[] =
{
"空手",
"带狼",
"带羊",
"带菜"
};
void search(int iStep)
{
int i;
if (a[iStep][0] + a[iStep][1] + a[iStep][2] + a[iStep][3] == 4)
{
for (i = 0; i < iStep; i++)
{
if (a[i][3] == 0)
{
printf("%s到对岸\n", name[b[i] + 1]);
}
else
{
printf("%s回本岸\n", name[b[i] + 1]);
}
}
printf("\n");
return;
}
for (i = 0; i < iStep; i++)
{
if (memcmp(a[i], a[iStep], sizeof(a[i])) == 0)
{
return;
}
}
if (a[iStep][1] != a[iStep][3] && (a[iStep][2] == a[iStep][1] || a[iStep][0] == a[iStep][1]))
{
return;
}
for (i = -1; i <= 2; i++)
{
b[iStep] = i;
memcpy(a[iStep + 1], a[iStep], sizeof(a[iStep + 1]));
a[iStep + 1][3] = 1 - a[iStep + 1][3];
if (i == -1)
{
search(iStep + 1);
}
else if (a[iStep][i] == a[iStep][3])
{
a[iStep + 1][i] = a[iStep + 1][3];
search(iStep + 1);
}
}
}
int main()
{
search(0);
return 0;
}
结果:
带羊到对岸
空手回本岸
带狼到对岸
带羊回本岸
带菜到对岸
空手回本岸
带羊到对岸
带羊到对岸
空手回本岸
带菜到对岸
带羊回本岸
带狼到对岸
空手回本岸
带羊到对岸
Press any key to continue
加我的qq号 476758573
我帮你详细解释再给你流程图啊
虽然时间过了 但希望有用啊
另外,站长团上有产品团购,便宜有保证
给,已经编译运行通过了:
#include<conioh>
#include<stdioh>
#include <stdlibh>
struct node /建立一个类似栈的数据结构并且可以浏览每一个数据点/
{
int x;
int y;
int state;
struct node next;
};
typedef struct node state;
typedef state link;
link PPointer1=NULL;
link PPointer2=NULL;
int a1,b1;
int a2,b2;
/栈中每个数据都分为0,1状态/
void Push(int a,int b,int n)
{
link newnode;
newnode=(link)malloc(sizeof(state));
newnode-> x=a;
newnode-> y=b;
newnode-> state=n;
newnode-> next=NULL;
if(PPointer1==NULL)
{
PPointer1=newnode;
PPointer2=newnode;
}
else
{
PPointer2-> next=newnode;
PPointer2=newnode;
}
}
void Pop() /d栈/
{
link pointer;
if(PPointer1==PPointer2)
{
free(PPointer1);
PPointer1=NULL;
PPointer2=NULL;
}
pointer=PPointer1;
while(pointer-> next!=PPointer2)
pointer=pointer-> next;
free(PPointer2);
PPointer2=pointer;
PPointer2-> next=NULL;
}
int history(int a,int b,int n) /比较输入的数据和栈中是否有重复的/
{
link pointer;
if(PPointer1==NULL)
return 1;
else
{
pointer=PPointer1;
while(pointer!=NULL)
{
if(pointer-> x==a&&pointer-> y==b&&pointer-> state==n)
return 0;
pointer=pointer-> next;
}
return 1;
}
}
int judge(int a,int b,int c,int d,int n) /判断这个状态是否可行,其中使用了history函数/
{
if(history(a,b,n)==0) return 0;
if(a>=0&&b>=0&&a<=3&&b<=3&&c>=0&&d>=0&&c<=3&&d<=3&&a+c==3&&b+d==3)
{
switch(n)
{
case 1:
{
if(a==3)
{
Push(a,b,n);
return 1;
}
else if(a==0)
{
Push(a,b,n);
return 1;
}
else if(a==b)
{
Push(a,b,n);
return 1;
}
else return 0;
}
case 0:
{
if(a==3)
{
Push(a,b,n);
return 1;
}
else if(a==0)
{
Push(a,b,n);
return 1;
}
else if(a>=b)
{
Push(a,b,n);
return 1;
}
else return 0;
}
}
}
else return 0;
}
int Duhe(int a,int b,int n) /递归法解决商人渡河问题,如果这一个状态符合/
{ /则判断下一个状态,直至问题解决/
if(a==0&&b==0) return 1;
if(n==0) /判断0状态时,商匪状态是否符合要求/
{
if(judge(a-1,b-1,4-a,4-b,1))
{
if(Duhe(a-1,b-1,1)==1)
return 1;
}
if(judge(a,b-2,3-a,5-b,1))
{
if(Duhe(a,b-2,1)==1)
return 1;
}
if(judge(a-2,b,5-a,3-b,1))
{
if(Duhe(a-2,b,1)==1)
return 1;
}
if(judge(a-1,b,4-a,3-b,1))
{
if(Duhe(a-1,b,1)==1)
return 1;
}
if(judge(a,b-1,3-a,4-b,1))
{
if(Duhe(a,b-1,1)==1)
return 1;
}
else
{
Pop();
return 0;
}
}
if(n==1) /判断0状态时,商匪状态是否符合要求/
{
if(judge(a+1,b+1,2-a,2-b,0))
{
if(Duhe(a+1,b+1,0)==1)
return 1;
}
if(judge(a,b+2,3-a,1-b,0))
{
if(Duhe(a,b+2,0)==1)
return 1;
}
if(judge(a+2,b,1-a,3-b,0))
{
if(Duhe(a+2,b,0)==1)
return 1;
}
if(judge(a+1,b,2-a,3-b,0))
{
if(Duhe(a+1,b,0)==1)
return 1;
}
if(judge(a,b+1,3-a,2-b,0))
{
if(Duhe(a,b+1,0)==1)
return 1;
}
else
{
Pop();
return 0;
}
}
return 0;
}
main()
{
link pointer;
Push(3,3,0);
Duhe(3,3,0);
pointer=PPointer1;
while(pointer!=NULL)
{
printf( "%d,%d---%d\n ",pointer-> x,pointer-> y,pointer-> state);
pointer=pointer-> next;
}
getch();
}
以上就是关于紧急求助:哪个数学建模的高手帮忙编一个:"商人过河"的程序,周五就要交,拜托全部的内容,包括:紧急求助:哪个数学建模的高手帮忙编一个:"商人过河"的程序,周五就要交,拜托、求程序代码,农夫、狼、羊和白菜过河问题。、用C语言处理商人过河等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)