问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言传教士与野人过河程序

发布网友 发布时间:2022-05-23 18:22

我来回答

3个回答

热心网友 时间:2023-11-05 18:20

你把问题看简单了。你的程序有几个问题: 

int boatf(int im,int ic,int ii)在这个函数中改变的im和ic的值只是改变的两个临时变量的值,并没有改变全局变量im和ic的值。你可以把前两个参数去掉。 

还有,你的for循环并不是可以正确遍历所有情况的。 

我写了一个程序,tc2.0通过了。在执行到第145种方案时成功。 

程序中case的几个顺序请不要任意改动,因为ltor和rtol函数中他们有对应关系。

本题目一共有5的13次方种方案,我的算法能排除很多非法方案。当然,我的算法不是最好的,希望高手能提供更高效的算法。 

做这个程序累坏了我几万个脑细胞,楼主给多加点分吧!谢谢了! 

#include<stdio.h>
/*定义N为所用步数,先定为6步*/
#define N 6
/*分别为左岸和右岸的im,ic数*/
int iml, imr, icl, icr;
/*定义sn为左右岸的移动的每一步*/
int sn[N+N-1] = {0};
void ltor(int i)
/* left to right */
{
    switch (i) {
    case 0:
        iml--;
        icl--;
        printf("%dim %dic | im + ic --> | %dim %dic\n", iml, icl, imr, icr);
        imr++;
        icr++;
        break;
    case 1:
        iml -= 2;
        printf("%dim %dic | im + im --> | %dim %dic\n", iml, icl, imr, icr);
        imr += 2;
        break;
    case 2:
        icl -= 2;
        printf("%dim %dic | ic + ic --> | %dim %dic\n", iml, icl, imr, icr);
        icr += 2;
        break;
    case 3:
        iml--;
        printf("%dim %dic |    im   --> | %dim %dic\n", iml, icl, imr, icr);
        imr++;
        break;
    case 4:
        icl--;
        printf("%dim %dic |    ic   --> | %dim %dic\n", iml, icl, imr, icr);
        icr++;
        break;
    default:
        printf("error\n");
    }
}
void rtol(int i)
/* right to left */
{
    switch (i) {
    case 0:
        imr--;
        icr--;
        printf("%dim %dic | <-- im + ic | %dim %dic\n", iml, icl, imr, icr);
        iml++;
        icl++;
        break;
    case 1:
        imr -= 2;
        printf("%dim %dic | <-- im + im | %dim %dic\n", iml, icl, imr, icr);
        iml += 2;
        break;
    case 2:
        icr -= 2;
        printf("%dim %dic | <-- ic + ic | %dim %dic\n", iml, icl, imr, icr);
        icl += 2;
        break;
    case 3:
        imr--;
        printf("%dim %dic | <--    im   | %dim %dic\n", iml, icl, imr, icr);
        iml++;
        break;
    case 4:
        icr--;
        printf("%dim %dic | <--    ic   | %dim %dic\n", iml, icl, imr, icr);
        icl++;
        break;
    default:
        printf("error\n");
    }
}
int set(int k)
/* set sn[i] */
{
    int i;
    for (i = k + 1; i < N + N - 1; i++)
    /* k 位之后的sn元素都赋值为零*/
    sn[i] = 0;
    sn[k]++;
    /* k 位元素自加1*/
    for (i = k; i > 0; i--)
    /* 每位元素超过4则置零,并向前一位进一*/
    {
        if (sn[i] > 4) {
            sn[i] = 0;
            sn[i - 1]++;
        } else break;
    }
    if (sn[0] > 5)
    /*sn遍历一遍则返回0,否则返回1*/
    return 0;
    else return 1;
}
void restart(void)
/* restart the work */
{
    imr = icr = 0;
    iml = icl = 3;
}
void main() {
    int i,
    step,
    found = 0;
    unsigned long n = 0;
    /* The NUM of the plans */
    do {
        i = 0;
        step = N - 1;
        n++;
        restart();
        ltor(sn[i]);
        while ((step--) || !(iml == 0 && icl == 0)) {
            i++;
            rtol(sn[i]);
            if (sn[i] == sn[i - 1]) {
                printf("The %ldth plan to R is not perfect!\n", n);
                break;
            }
            if ((imr > 0 && imr < icr) || imr < 0 || icr < 0 || (iml > 0 && iml < icl) || iml < 0 || icl < 0) {
                printf("The %ldth plan to R is fail!\n", n);
                break;
            }
            i++;
            ltor(sn[i]);
            if (sn[i] == sn[i - 1]) {
                printf("The %ldth plan to R is not perfect!\n", n);
                break;
            }
            if ((imr > 0 && imr < icr) || imr < 0 || icr < 0 || (iml > 0 && iml < icl) || iml < 0 || icl < 0) {
                printf("The %ldth plan to R is fail!\n", n);
                break;
            }
        }
        if (iml == 0 && icl == 0) {
            printf("The plan to Pass the river is success!\n");
            getchar();
            break;
        }
    } while ( set ( i ));
}

热心网友 时间:2023-11-05 18:21

你把问题看简单了。你的程序有几个问题:
int
boatf(int
im,int
ic,int
ii)在这个函数中改变的im和ic的值只是改变的两个临时变量的值,并没有改变全局变量im和ic的值。你可以把前两个参数去掉。
还有,你的for循环并不是可以正确遍历所有情况的。
我写了一个程序,tc2.0通过了。在执行到第145种方案时成功。
程序中case的几个顺序请不要任意改动,因为ltor和rtol函数中他们有对应关系。
本题目一共有5的13次方种方案,我的算法能排除很多非法方案。当然,我的算法不是最好的,希望高手能提供更高效的算法。
做这个程序累坏了我几万个脑细胞,楼主给多加点分吧!谢谢了!
#include<stdio.h>
#define
N
6
/*定义N为所用步数,先定为6步*/
int
iml,imr,icl,icr;
/*分别为左岸和右岸的im,ic数*/
int
sn[N+N-1]={0};
/*定义sn为左右岸的移动的每一步*/
void
ltor(int
i)
/*
left
to
right
*/
{
switch(i)
{
case
0:
iml--;icl--;
printf("%dim
%dic
|
im
+
ic
-->
|
%dim
%dic\n",iml,icl,imr,icr);
imr++;icr++;
break;
case
1:
iml-=2;
printf("%dim
%dic
|
im
+
im
-->
|
%dim
%dic\n",iml,icl,imr,icr);
imr+=2;
break;
case
2:
icl-=2;
printf("%dim
%dic
|
ic
+
ic
-->
|
%dim
%dic\n",iml,icl,imr,icr);
icr+=2;
break;
case
3:
iml--;
printf("%dim
%dic
|
im
-->
|
%dim
%dic\n",iml,icl,imr,icr);
imr++;
break;
case
4:
icl--;
printf("%dim
%dic
|
ic
-->
|
%dim
%dic\n",iml,icl,imr,icr);
icr++;
break;
default:printf("error\n");
}
}
void
rtol(int
i)
/*
right
to
left
*/
{
switch(i)
{
case
0:
imr--;icr--;
printf("%dim
%dic
|
<--
im
+
ic
|
%dim
%dic\n",iml,icl,imr,icr);
iml++;icl++;
break;
case
1:
imr-=2;
printf("%dim
%dic
|
<--
im
+
im
|
%dim
%dic\n",iml,icl,imr,icr);
iml+=2;
break;
case
2:
icr-=2;
printf("%dim
%dic
|
<--
ic
+
ic
|
%dim
%dic\n",iml,icl,imr,icr);
icl+=2;
break;
case
3:
imr--;
printf("%dim
%dic
|
<--
im
|
%dim
%dic\n",iml,icl,imr,icr);
iml++;
break;
case
4:
icr--;
printf("%dim
%dic
|
<--
ic
|
%dim
%dic\n",iml,icl,imr,icr);
icl++;
break;
default:printf("error\n");
}
}
int
set(int
k)
/*
set
sn[i]
*/
{
int
i;
for(i=k+1;i<N+N-1;i++)
/*
k
位之后的sn元素都赋值为零*/
sn[i]=0;
sn[k]++;
/*
k
位元素自加1*/
for(i=k;i>0;i--)
/*
每位元素超过4则置零,并向前一位进一*/
{
if(sn[i]>4)
{
sn[i]=0;
sn[i-1]++;
}
else
break;
}
if(sn[0]>5)
/*sn遍历一遍则返回0,否则返回1*/
return
0;
else
return
1;
}
void
restart(void)
/*
restart
the
work
*/
{
imr=icr=0;
iml=icl=3;
}
void
main()
{
int
i,step,found=0;
unsigned
long
n=0;
/*
The
NUM
of
the
plans
*/
do
{
i=0;
step=N-1;
n++;
restart();
ltor(sn[i]);
while((step--)
||
!(iml==0
&&
icl==0))
{
i++;
rtol(sn[i]);
if(sn[i]==sn[i-1])
{
printf("The
%ldth
plan
to
R
is
not
perfect!\n",n);
break;
}
if((imr>0
&&
imr<icr)
||
imr<0
||
icr<0
||
(iml>0
&&
iml<icl)
||
iml<0
||
icl<0)
{
printf("The
%ldth
plan
to
R
is
fail!\n",n);
break;
}
i++;
ltor(sn[i]);
if(sn[i]==sn[i-1])
{
printf("The
%ldth
plan
to
R
is
not
perfect!\n",n);
break;
}
if((imr>0
&&
imr<icr)
||
imr<0
||
icr<0
||
(iml>0
&&
iml<icl)
||
iml<0
||
icl<0)
{
printf("The
%ldth
plan
to
R
is
fail!\n",n);
break;
}
}
if(iml==0
&&
icl==0)
{
printf("The
plan
to
Pass
the
river
is
success!\n");
getchar();
break;
}
}while(set(i));
}

热心网友 时间:2023-11-05 18:21

程序很乱阿,没细看

你那 for(ii=1;ii<=5;ii++)
ii 永远都是1,还没执行 ii++ 就 goto了

建议不要用goto
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 魔兽世界 求SM治疗天赋 请高手指点小弟 INTIMURU注册过商标吗?还有哪些分类可以注册? The mother of a young man ()Oscar was intim 维亚尔的人物生平 INTIMSERVICE注册过商标吗?还有哪些分类可以注册? intim ,inventor怎么翻译 什么是民生资金?请详细解释 谢明的出版教材专著 张宝臣的教材著作 什么是民生资金??? 邹伟的参编的教材 【中国兵装集团】与【中国兵器集团】的联系与区别? 什么是民生资金?这个是什么意思? 杨华的编写教材 求温兆伦早期一部电视剧他用钱烧信箱里面的亲子鉴定文件的 副主编挂名可以评职称吗 给我一份这几个片子的简介 军工安防产业联盟和兵工学会是属于一个单位么? 梦见自己家所有佛都碎了 只剩下观音菩萨.还有弥勒佛头掉下来了.而且佛的表情非常痛苦.求解 温兆伦主演的江湖小子在哪里可以看 c语言:我编的传教士与野人过河程序 机器人锦标赛冠军被送戒网瘾学校后失联,涉事机构是否需承担法律责任? 英文故事才能秀 随机产生十个(100,200]之间的整数,求最小值,vb程序怎样编辑,求大神啊T^T 王者荣耀中,怎样玩程咬金才能秀? lol怎么才能秀操作? 什么样的人才能称“秀才”,“秀才”一直 河南的豫剧头把弦叫什么? 职场如何面试才能秀出自我? 怎么才能秀出自己的个性, 公孙离要练多少场才能秀 清代秀才的等级及待遇? 毕业生,怎样写简历才能把才能秀出来 怎样才能秀好十字绣,平整点,后面还是一顺的 睡袋是什么 怎样才能秀好十字绣 睡袋是什么产品 有才华的都是秀才吗 请问十字秀怎么才能秀得快秀得好呀? 睡袋和穿衣服睡觉有什么区别