题解 | #农夫、羊、菜和狼的故事#

农夫、羊、菜和狼的故事

https://www.nowcoder.com/practice/ab5702134dc5402b8c5156277c67cab1

限制了长度的深度优先搜索

#include<iostream>
#include<vector>

using namespace std;


bool jude(int b[4], int
          k) { //判断当前状态下农夫是否可以带着k(k=1、2、3)移动,或者空手移动(k=4)
    int* a = new int[4];
    for (int i = 0; i < 4; i++)a[i] = b[i];
    if (k != 4) {
        if (a[0] != a[k])return false; //农夫与K(1、2、3)不在同一边
        a[k] = 1 - a[k];
    }
    a[0] = 1 - a[0];
    if (a[1] == a[2] && a[0] != a[2])return false;
    if (a[2] == a[3] && a[0] != a[2])return false;
    free(a);

    return true;
}

void move(int** a, int k) {
    int* b;
    b = *a;
    if (b[0] == 0) {
        b[0] = 1;
        switch (k) {
            case 1:
                cout << "wolf_go" << endl;
                b[k] = 1;
                break;
            case 2:
                cout << "sheep_go" << endl;
                b[k] = 1;
                break;
            case 3:
                cout << "vegetable_go" << endl;
                b[k] = 1;
                break;
            case 4:
                cout << "nothing_go" << endl;
                break;
        }
    } else {
        b[0] = 0;
        switch (k) {
            case 1:
                cout << "wolf_come" << endl;
                b[k] = 0;
                break;
            case 2:
                cout << "sheep_come" << endl;
                b[k] = 0;
                break;
            case 3:
                cout << "vegetable_come" << endl;
                b[k] = 0;
                break;
            case 4:
                cout << "nothing_come" << endl;
                break;
        }
    }
}

bool finish(int a[4]) { //判断是否已经完成任务
    if (a[0] == 0 || a[1] == 0 || a[2] == 0 || a[3] == 0)return false;
    else return true;
}

void findResult(vector<vector<int>>* results, vector<int>* result, int** status,
                int k, int n) {
    if (n == 10)return ; //限制搜索的长度
    //移动
    int* a;
    a = *status;
    a[0] = 1 - a[0];
    if (k != 4)a[k] = 1 - a[k];
    (*result).push_back(k);
    //判断是否找到路径,根据判断结果作出相应的选择
    if (finish(*status)) (*results).push_back(*result);
    else {
        for (int i = 1; i <= 4; i++)
            if (jude(a, i))findResult(results, result, status, i, n + 1);
    }
    //取消移动
    a[0] = 1 - a[0];
    if (k != 4)a[k] = 1 - a[k];
    (*result).pop_back();
}

int main() {
    int* status = new
    int[4]; //status[0]表示农夫,status[1]表示狼,status[2]表示羊,status[3]表示菜
    //0表示其在左边,1表示其在右边 ,假设一开始所有成员都去了左边
    for (int i = 0; i < 4; i++)status[i] = 0;

    vector<vector<int>> results;
    vector<int> result;

    for (int i = 1; i <= 4; i++)
        if (jude(status, i))findResult(&results, &result, &status, i, 1);

    int k = 0;
    for (int i = 0; i < results.size(); i++) {
        if (results[i].size() < results[k].size())k = i;
    }
    for (int i = 0; i < results[k].size(); i++) {
        move(&status, results[k][i]);
    }
    cout << "succeed" << endl;


    return 0;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
03-19 10:38
实力求职者:真的绷不住了,第一张霸总人设,第二张求生欲拉满
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
5652次浏览 53人参与
# 你的实习产出是真实的还是包装的? #
1171次浏览 29人参与
# MiniMax求职进展汇总 #
23067次浏览 299人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
6964次浏览 37人参与
# 简历第一个项目做什么 #
31275次浏览 314人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186406次浏览 1115人参与
# 米连集团26产品管培生项目 #
4377次浏览 203人参与
# 研究所笔面经互助 #
118765次浏览 577人参与
# 面试紧张时你会有什么表现? #
30406次浏览 188人参与
# 简历中的项目经历要怎么写? #
309439次浏览 4157人参与
# AI时代,哪些岗位最容易被淘汰 #
62538次浏览 736人参与
# 网易游戏笔试 #
6329次浏览 83人参与
# 职能管理面试记录 #
10703次浏览 59人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
6902次浏览 154人参与
# 从哪些方向判断这个offer值不值得去? #
56709次浏览 357人参与
# 你怎么看待AI面试 #
179317次浏览 1170人参与
# 腾讯音乐求职进展汇总 #
160406次浏览 1105人参与
# 小红书求职进展汇总 #
226861次浏览 1356人参与
# 正在春招的你,也参与了去年秋招吗? #
362594次浏览 2631人参与
# 你的房租占工资的比例是多少? #
92128次浏览 896人参与
# 校招笔试 #
466773次浏览 2952人参与
# 机械求职避坑tips #
94402次浏览 567人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务