c语言第一天给1分钱,c语言程序:陌生人每天给商人10万元钱,直到满一个月(30天),而商人第一天给陌生人1分钱,第二天...

2016-11-24 回答

给,已经编译运行通过了:

#include

#include

#include

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() /*弹栈*/

{

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();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值