HDU 2269 Cross The River

本文深入解析HDU_2269问题,通过实例阐述如何利用二进制位操作表示状态,以及如何运用广度优先搜索解决涉及多个元素相互依赖的问题。主要内容包括状态转移逻辑设计、使用二进制表示状态空间、避免重复计算和高效求解路径。适用于对状态空间搜索和二进制操作感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HDU_2269

    唉,一开是理解错了这句话,WA到死……“Then m line follows ,each line contains several things ,which means if these things stay together without the farmer,some thing will been eaten.”这句话的意思是每一行中的若干个东西在农夫不在的时候,不能同时待在一起,而不是说这些东西中任意两者都不能待在一起。

    可以用各个二进制位的0、1分别表示每个物品在哪个岸上,再用一个二进制位表示一下农夫现在在哪里,这样总状态并不多,所以直接广搜就行了。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define MAXD 15
#define ST 2048
#define INF 0x3f3f3f3f
char name[MAXD][25];
int N, M, T, f[2][ST], vis[2][ST], danger[ST];
char b[1010];
void init()
{
    int i, j, k, n, st;
    for(i = 0; i < N; i ++) scanf("%s", name[i]);
    memset(danger, 0, sizeof(danger));
    gets(b);
    for(i = 0; i < M; i ++)
    {
        gets(b);
        st = 0;
        char *p = strtok(b, " ");
        for(j = 0; j < N; j ++) if(strcmp(name[j], p) == 0) st |= 1 << j;
        while((p = strtok(NULL, " ")) != NULL)
            for(j = 0; j < N; j ++) if(strcmp(name[j], p) == 0) st |= 1 << j;
        danger[st] = 1;
    }
}
int can(int st)
{
    int i, n = 0;
    for(i = 0; i < N; i ++)
        if(st & 1 << i) ++ n;
    return n <= T;
}
int check(int st)
{
    for(int i = st; i > 0; i = i - 1 & st)
        if(danger[i]) return 0;
    return 1;    
}
void solve()
{
    int i, j, k, cur, st, ans = -1, D = (1 << N) - 1;
    std::queue <int> q;
    memset(vis, 0, sizeof(vis));
    f[0][0] = 0, vis[0][0] = 1;
    q.push(0);
    while(!q.empty())
    {
        cur = q.front() & 1, st = q.front() >> 1, q.pop();
        if(cur == 1 && st == D)
        {
            ans = f[cur][st];
            break;    
        }
        if(cur == 1 && check(st) && !vis[0][st])
            f[0][st] = f[1][st] + 1, vis[0][st] = 1, q.push(st << 1);
        if(cur == 0) st = ~st & D;
        for(i = st; i > 0; i = i - 1 & st)
            if(can(i) && check(st - i))
            {
                if(cur == 0)
                {
                    int t = ~(st - i) & D;
                    if(!vis[1][t])
                        f[1][t] = f[0][~st & D] + 1, vis[1][t] = 1, q.push(t << 1 | 1);
                }
                else
                {
                    int t = st - i;
                    if(!vis[0][t])
                        f[0][t] = f[1][st] + 1, vis[0][t] = 1, q.push(t << 1);
                }
            }
    }
    printf("%d\n", ans);
}
int main()
{
    while(scanf("%d%d%d", &N, &M, &T) == 3)
    {
        init();
        solve();
    }
    return 0;    
}

 

 

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值