您的位置 首页 > 数码极客

【clrscr】商人过河问题的这种解答方法,你看过吗?

今天给大家讲一个数学题。小时候因为各种数学问题遇到困难的时候,相信很多朋友也回答了商人过河的问题。大家可以在下面公布自己的解决方案!

.

商人过河可以看作是多川决策过程。

每一步由此岸到彼岸或彼岸到此岸船上的人员在安全的前提下(两岸的随从数不比商人多),经有限步使全体人员过河。用状态变量表示某一岸的人员状况,决策变量表示船上的人员情况,可以找出状态随决策变化的规律。问题就转换为在状态的允许变化范围内(即安全渡河条件),确定每一步的决策,达到安全渡河的目标。

这里我将用C语言来解决这个小难题,我期待和大家一起交流学习 探索和体验编程的魅力(群号:233026065)

参考代码如下:

#include <;

#include <conio.h>

#include <;

void dwframe()

{

window(1,1,25,80);

textbackground(LIGHTBLUE);

textcolor(YELLOW);

clrscr();

gotoxy(2,2);

printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓");

gotoxy(2,3);

printf("┃");

gotoxy(76,3);

printf("┃");

gotoxy(2,4);

printf("┃");

gotoxy(76,4);

printf("┃");

gotoxy(2,5);

printf("┃");

gotoxy(76,5);

printf("┃");

gotoxy(2,6);

printf("┃");

gotoxy(76,6);

printf("┃");

gotoxy(2,7);

printf("┃");

gotoxy(76,7);

printf("┃");

gotoxy(2,8);

printf("┃");

gotoxy(76,8);

printf("┃");

gotoxy(2,9);

printf("┃");

gotoxy(76,9);

printf("┃");

gotoxy(2,10);

printf("┃");

gotoxy(76,10);

printf("┃");

gotoxy(2,11);

printf("┃");

gotoxy(76,11);

printf("┃");

gotoxy(2,11);

printf("┃");

gotoxy(76,11);

printf("┃");

gotoxy(2,12);

printf("┃");

gotoxy(76,12);

printf("┃");

gotoxy(2,14);

printf("┃");

gotoxy(76,14);

printf("┃");

gotoxy(2,15);

printf("┃");

gotoxy(76,15);

printf("┃");

gotoxy(2,16);

printf("┃");

gotoxy(76,16);

printf("┃");

gotoxy(2,17);

printf("┃");

gotoxy(76,17);

printf("┃");

gotoxy(2,18);

printf("┃");

gotoxy(76,18);

printf("┃");

gotoxy(2,19);

printf("┃");

gotoxy(76,19);

printf("┃");

gotoxy(2,20);

printf("┃");

gotoxy(76,20);

printf("┃");

gotoxy(2,21);

printf("┃");

gotoxy(76,21);

printf("┃");

gotoxy(2,22);

printf("┃");

gotoxy(76,22);

printf("┃");

gotoxy(2,23);

printf("┃");

gotoxy(76,23);

printf("┃");

gotoxy(2,24);

printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");

}

void helpf()

{

dwframe();

gotoxy(25,4);

printf("^_^欢迎使用商人过河游戏!^_^");

gotoxy(4,6);

printf("游戏说明:");

gotoxy(5,7);

printf("三个商人带着三个随从和货物过河,船每次最多只能载两个人,");

gotoxy(5,8);

printf("要求在过河期间,任一岸上商人的人数要大于或等于随从的人数,");

gotoxy(5,9);

printf("否则随从会杀掉商人抢走货物。");

gotoxy(5,11);

printf("游戏操作:(1)依次输入过河的商人和随从人数;");

gotoxy(5,12);

printf(" (2)非法输入按键将重新开始。");

gotoxy(2,13);

printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫");

}

char a[6];

char b[6];

void printcase(char a[],char b[])

{

int i,j,xa,xb,x0,ya,yb,y0;

xa=xb=x0=ya=yb=y0=0;

gotoxy(11,14);

printf("此岸 彼岸\n");

for(i=0;i<6;i++)

{

if(a[i]=='A')

xa++;

else if (a[i]=='B')

xb++;

else if(a[i]=='0')

x0++;

}

gotoxy(11,15);

for(i=1;i<=xa;i++)

printf("商人 ");

gotoxy(11,16);

for(i=1;i<=xb;i++)

printf("随从 ");

gotoxy(11,17);

for(i=1;i<=x0;i++)

printf(" ");

for(j=0;j<6;j++)

{

if(b[j]=='A')

ya++;

else if(b[j]=='B')

yb++;

else if(b[j]=='0')

y0++;

}

gotoxy(31,15);

for(j=1;j<=ya;j++)

printf("商人 ");

gotoxy(31,16);

for(j=1;j<=yb;j++)

printf("随从 ");

gotoxy(31,17);

for(j=1;j<=y0;j++)

printf(" ");

if(xa==0 && xb==0 && ya==3 && yb==3)

{

gotoxy(15,21);

printf("恭喜你!你已成功帮助商人安全过河!按任意键退出...");

getch();

window(1,1,25,80);

textbackground(BLACK);

textcolor(LIGHTGRAY);

clrscr();

exit(0);

}

}

void main()

{

int i,x,y,key,ca,cb,j,aA,aB,bA,bB;

char ch;

Start:

helpf();

gotoxy(15,16);

printf("请按任意键开始游戏(按Q键退出)...");

ch=getch();

if(ch=='Q'||ch=='q')

{

window(1,1,25,80);

textbackground(BLACK);

textcolor(LIGHTGRAY);

clrscr();

exit(0);

}

helpf();

for(i=0;i<3;i++)

a[i]='A';

for(i=3;i<6;i++)

a[i]='B';

for(i=0;i<6;i++)

b[i]='0';

printcase(a,b);

while(1)

{

gotoxy(20,18);

printf("输入去彼岸商人的人数: ");

scanf("%d",&x);

gotoxy(20,18);

printf("输入去彼岸随从的人数: ");

scanf("%d",&y);

for(ca=0,cb=0,i=0;i<6;i++)

{

if(a[i]=='A')

ca++;

else if(a[i]=='B')

cb++;

}

if(x<0 || x>ca || y<0 || y>cb || x+y<1 ||x+y>2)

{

gotoxy(15,21);

printf("输入有误!!按任意键重新开始...");

getch();

goto Start;

}

for(i=1;i<=x;i++)

{

for(j=0;j<6;j++)

if(a[j]=='A')

{

a[j]='0';

break;

}

}

for(i=1;i<=x;i++)

{

for(j=0;j<6;j++)

if(b[j]=='0')

{

b[j]='A';

break;

}

}

for(i=1;i<=y;i++)

{

for(j=0;j<6;j++)

if(a[j]=='B')

{

a[j]='0';

break;

}

}

for(i=1;i<=y;i++)

{

for(j=0;j<6;j++)

if(b[j]=='0')

{

b[j]='B';

break;

}

}

for(aA=0,aB=0,i=0;i<6;i++)

{

if(a[i]=='A')

aA++;

else if(a[i]=='B')

aB++;

}

for(bA=0,bB=0,i=0;i<6;i++)

{

if(b[i]=='A')

bA++;

else if(b[i]=='B')

bB++;

}

if((aA==3) ||(bA==3) || (aA==aB) || (bA==bB))

{

helpf();

printcase(a,b);

}

else

{

gotoxy(15,21);

printf("商人被杀,按任意键重新开始...");

getch();

goto Start;

}

gotoxy(20,18);

printf("输入回此岸商人的人数: ");

scanf("%d",&x);

gotoxy(20,18);

printf("输入回此岸随从的人数: ");

scanf("%d",&y);

for(ca=0,cb=0,i=0;i<6;i++)

{

if(b[i]=='A')

ca++;

else if(b[i]=='B')

cb++;

}

if(x<0 || x>ca || y<0 || y>cb || x+y<1 || x+y>2)

{

gotoxy(15,21);

printf("输入有误!!按任意键重新开始...");

getch();

goto Start;

}

for(i=1;i<=x;i++)

{

for(j=0;j<6;j++)

if(b[j]=='A')

{

b[j]='0';

break;

}

}

for(i=1;i<=x;i++)

{

for(j=0;j<6;j++)

if(a[j]=='0')

{

a[j]='A';

break;

}

}

for(i=1;i<=y;i++)

{

for(j=0;j<6;j++)

if(b[j]=='B')

{

b[j]='0';

break;

}

}

for(i=1;i<=y;i++)

{

for(j=0;j<6;j++)

if(a[j]=='0')

{

a[j]='B';

break;

}

}

for(aA=0,aB=0,i=0;i<6;i++)

{

if(a[i]=='A')

aA++;

else if(a[i]=='B')

aB++;

}

for(bA=0,bB=0,i=0;i<6;i++)

{

if(b[i]=='A')

bA++;

else if(b[i]=='B')

bB++;

}

if((aA==3) ||(bA==3) || (aA==aB) || (bA==bB))

{

helpf();

printcase(a,b);

}

else

{

gotoxy(15,21);

printf("商人被杀,按任意键重新开始...");

getch();

goto Start;

}

}

}

.

这是今天的内容,有问题的地方大家可以指出。

如果对编程方面有兴趣的可以加群:233026065,大家一起学习交流。

群内有许多学习资料、视频,免费课......

关于作者: admin

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐