一道编程题

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
//实验原理:假设开始时传教士、野人和船都在右岸,用数组(a,b,c)分别表示右岸传教士个数、右岸野人个数、船的位置,则可分为三种情况讨论:
 //A、n>m/2。此种情况下,先把所有的野人度过去,每次返回一个野人,当出现(m,0,0)情况时,返回m-n个野人(若m==n,返回1个野人)。然后渡n个传教士,此时野人==传教士,然后返回一个野人和传教士,再开始最大限度的渡传教士,每次返回一个野人,最终直到a==b==c==0;
 //B、n<=3&&n<=m/2 || n==1,显然此时无解;
// C、n>=4&&n<=m/2,此时只能每次传n/2个传教士和野人,每次返回一个野人和传教士,直到最终结果。



//初始状态是s(m,m,1)----最终状态是s(0,0,0)

#include "iostream"
using namespace std;
bool flag = false;            //标记是否有解
bool af = false;                //标记a是否为0
bool bf = false;                //当b变为0后赋值为true;
bool ef = false;                //当a==b后赋值为true
bool f = false;                //判断n是否大于m/2
int m;//传教士野人的个数
int n;//船一次能装载的人数
void crossing(int a,int b,int c);
int main()
{
    cout<<"传教士与野人过河问题。\n假设最初时传教士与野人在河的右岸。\n";
    cout<<"请输入传教士野人的个数:\n";
    cin>>m;
    cout<<"请输入船一次能装载的人数: \n";
    cin>>n;
    cout<<"右岸传教士人数\t"<<"右岸野人个数\t"<<"船的位置(1.右岸 0左岸)"<<endl;
    //此种情况无解
    if((n<=3 && n<=m/2) || n==1)        
        {
            cout<<"No solution!\n";
            system("pause");
            return 0;    
           }
    if(n > m/2)
        {
            f = true;
        }
        crossing(m,m,1);
    if(flag == true)
        {
            cout<<"Success!\n";        
        }
    else
        {
            cout<<"No solution!\n";        
        }
        system("pause");
        return 0;
}
void crossing(int a,int b,int c)
{
        if(flag==true)             
            {
                return;
            }
        else
       {
           if(c == 1)//船在右岸时:
           {
            cout<<"\t"<<a<<"\t\t"<<b<<"\t\t"<<c<<"\t\n";
            //  如果n>m/2
            if(f==true)                        
            {
                if(bf!=true)                //b未达到过0  b!=0
                {
                    if(a+b<=n)//如果a+b<=n,完全渡过
                    {    
                        crossing(0,0,1-c);        //递归
                    }
                    else
                    {
                        for(int j = n;j >= 0;j--)
                        {
                            if(b >= j)//野人数大于或等于船的载量
                            {    
                                crossing(a,b-j,1-c);        //递归
                                if(flag==true)
                                    return;
                            }
                        }
                    }
                }
                else if(ef!=true&& af==false)    //b!=0 && a!=0
                {
                    for(int i = n;i>=0;i--)
                    {
                        if(a>=i)
                        {
                            crossing(a-i,b,1-c);        //递归
                            if(flag==true)
                            {
                                return;
                            }
                        }
                    }
                }
                if(ef == true && af==false)//a==b && a!=0
                {
                    if(a>=n)
                    {
                        crossing(a-n,b,1-c);         //递归
                    }
                    //如果a<n时:
                    else if(a+b<n)
                    {
                        crossing(0,0,1-c);
                    }
                    else
                    {
                        crossing(0,b-(n-a),1-c);
                    }
                }
                if(af==true)//a==0
                {    if(b>=n)
                    {
                            crossing(a,b-n,1-c);            //递归
                    }
                    else                    
                    {
                            crossing(a,0,1-c);
                    }
                }
            }
             //n<=m/2
            else
            {
                crossing(a-n/2,b-n/2,1-c);     //递归
            }
        }
        //船在左岸时,右岸的情况:
        if(c == 0)
        {
            cout<<"\t"<<a<<"\t\t"<<b<<"\t\t"<<c<<"\t\n";
            if(a == b && b == c && a == 0)
            {
                flag = true;
                return;
            }
            if(f==true)                    //如果n>m/2
            {
                
                if(b==0)
                {
                    bf = true;

                    if(m <= n)
                        crossing(a,b+1,1-c);            //递归
                    else
                        crossing(a,b+m-n,1-c);
                }
                
                if(a==b)
                {
                    ef = true;
                    crossing(a+1,b+1,1-c);            //递归
                    
                }
                if(a==0)
                {
                    af = true;
                    crossing(a,b+1,1-c);                //递归
                }
                while(bf!=true)
                {
                    crossing(a,b+1,1-c);                //递归
                }
            }
            else                        //n<=m/2
                crossing(a+1,b+1,1-c);        //递归
        }
 }
}







设计和编写一道有效的编程题需要综合考虑多个方面,包括题目目标、难度适配、测试用例完整性以及代码的可读性和扩展性。以下是设计编程题时的完整流程和注意事项: ### 题目目标设定 每道编程题都应有明确的目标。题目可以是算法实现、数据结构操作、逻辑推理等。例如,如果题目旨在考察数组操作,那么可以设计一个涉及数组遍历、排序或查找特定元素的题目。明确目标有助于后续的题目设计和测试用例编写。 ### 难度分级与受众分析 编程题的难度应根据目标受众进行调整。对于初学者,题目应简单明了,避免复杂的逻辑或高级语言特性。例如,可以设计一个简单的整数加法函数,或者一个基本的字符串操作问题。而对于中高级开发者,则可以引入更复杂的场景,如动态规划、图论或并发编程[^2]。 ### 题目描述清晰 题目描述应简洁明了,避免歧义。应包括输入输出格式、约束条件以及示例。例如,如果题目涉及数组操作,需明确数组的最大长度、元素的取值范围以及输入输出的具体格式。清晰的描述有助于减少误解,使开发者能专注于解决问题本身。 ### 测试用例设计 测试用例是验证答案正确性的关键。应涵盖正常情况、边界条件和异常情况。例如,在一道求两个整数平均值的题目中,测试用例应包括正负数、零值、最大最小值等组合。此外,还需考虑整数溢出问题,并确保代码在极端情况下仍能正确运行[^5]。 ### 示例代码与提示 对于教学性质的编程题,提供示例代码或伪代码有助于引导开发者。例如,在一道涉及循环结构的题目中,可以给出伪代码结构,如 `while not 条件判断 do 语句块`,帮助开发者理解流程控制[^4]。同时,可以提供提示,如“考虑使用双指针法”或“注意空间复杂度限制”。 ### 代码实现与模板 编写代码时,应遵循良好的编码规范。例如,在 C++ 中使用类模板可以提高代码的复用性,适用于不同数据类型的处理。模板函数可以简化代码结构,使开发者专注于核心逻辑的实现[^3]。 ```cpp #include <iostream> using namespace std; template <typename T> void solve() { int n; cin >> n; T a[10010]; T b[10010]; for (int i = 0; i < n; i++) { cin >> a[i]; } for (int j = 0; j < n; j++) { cin >> b[j]; cout << b[j]; } for (int i = 0; i < n; i++) { cout << a[i]; } cout << endl; } int main() { int t; cin >> t; while (t--) { char type; cin >> type; if (type == 'I') { solve<int>(); } else if (type == 'C') { solve<char>(); } else if (type == 'D') { solve<double>(); } } return 0; } ``` ### 评估与反馈机制 题目完成后,应建立评估机制,如自动评分系统或人工审核。评估标准应包括代码的正确性、效率、可读性及是否符合题目要求。反馈机制有助于开发者了解自己的错误,并进行针对性改进。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值