USACO 6.5.3 Betsy's Tour 搜索剪枝

【USACO 2013 February Gold】分割农场 Description 农夫约翰的农场被分成了N*N(2 约翰决定修建围栏将奶牛们分开,根据当地的法律,农场内的围栏必须沿水平或垂直方向穿过整个农场,但是不能从小牧场中穿过(只能沿方格的边缘)。约翰的存款最多只能修建k条围栏(1 约翰想要修建这样的围栏:使得农场中最大的一群奶牛中的奶牛数量尽可能的小(如果两只奶牛不用翻越围栏就能相互到达,那么它们就是同一群奶牛)。告诉你每块小牧场 阅读详情

http://train.usaco.org/usacoprob2?a=BI4LEPNXcEa&S=betsy

题目大意:一个N*N的方阵(N<=7),求从左上角出发到左下角结束经过每个格子一次且仅一次的路径总数


听说标准的做法是在左侧补两列然后作为等效的哈密顿回路用插头dp的方法求解,但是我实在是看不懂,所以我学了搜索剪枝的方法,没想到过的绰绰有余,搜索真是其乐无穷啊


参考资料:http://blog.youkuaiyun.com/kk303/article/details/7244083

主要剪枝的判断有两个(我是剪的下一步,参考里剪的当前步):

①如果下一步的格子的四个邻接格中有三个已经走过,那么下一步必然只能走这个格子,否则这个格子将成为死胡同,永远无法被访问(结束格例外,因为它只进不出)。如果有两个格子满足这样的性质,那么这一步无法迈出,当前情况无效,直接剪枝

②如果下一步格子的四个邻接格中,左右已访问上下未访问(或反之),则不能迈向这一格。考虑到路径是一笔画的,所以左右格必然被一条路径连接,一旦这一格被访问,这将变成一个完全封闭的图形,不论此后是向上走还是向下走都必然会造成有格子无法被访问的情况


还有一个问题就是要保证最后一格是左下角,需要在DFS的跳出条件里做点小操作

遇到的问题:我在写格子状态的判断函数时没有把各种情况理清楚,所以一开始产生了在一些情况下会不知道返回什么东西的情况,以后在多条条件判断语句时需要注意,无论如何最外面都要有一条return

/*
ID: frontie1
TASK: betsy
LANG: C++
*/
#include <iostream>
#include <cstdio>

using namespace std;

int go_r[4] = {0, -1, 0, 1};
int go_c[4] = {1, 0, -1, 0};

int N;
bool visited[10][10] = {{0}};
int cnt = 0;

int state(int r, int c)//0-normal; 1-must; 2-invalid; 3-valley
{
    if(r == N && c == 1) return 0;
    int tem = 0;
    for(int i = 0; i < 4; ++i){
        if(visited[r+go_r[i]][c+go_c[i]]) tem++;
    }
    if(tem == 4) return 2;
    if(tem == 3) return 1;

    bool flag = false;
    if(tem == 2){
        if(visited[r+go_r[0]][c+go_c[0]] == visited[r+go_r[2]][c+go_c[2]]){
            return 3;
        }
    }
    return 0;
}

void DFS(int dep, int r, int c)
{

    if(r == N && c == 1){
        if(dep == N*N-1) ++cnt;
        return;
    }
    if(dep == N*N-1) return;
    visited[r][c] = true;

    int must_direction = -1;
    int nxt_r, nxt_c;
    for(int i = 0; i < 4; ++i){
        nxt_r = r + go_r[i];
        nxt_c = c + go_c[i];
        if(visited[nxt_r][nxt_c]) continue;
        if(state(nxt_r, nxt_c) == 1){
            if(must_direction == -1) must_direction = i;
            else{
                visited[r][c] = false;
                return;
            }
        }
    }
    if(must_direction != -1){
        DFS(dep+1, r+go_r[must_direction], c+go_c[must_direction]);
    }
    else{
        for(int i = 0; i < 4; ++i){
            nxt_r = r + go_r[i];
            nxt_c = c + go_c[i];
            if(visited[nxt_r][nxt_c]) continue;
            if(state(nxt_r, nxt_c) == 3) continue;
            DFS(dep+1, nxt_r, nxt_c);
        }
    }
    visited[r][c] = false;
    return;
}

int main()
{
    freopen("betsy.in", "r", stdin);
    freopen("betsy.out", "w", stdout);

    cin >> N;

    for(int i = 0; i <= N+1; ++i){
        visited[i][0] = true;
        visited[i][N+1] = true;
        visited[0][i] = true;
        visited[N+1][i] = true;
    }

    DFS(0, 1, 1);

    cout << cnt << endl;

    return 0;
}

Betsy_Tour一类DP的解法 连通性状态压缩dp,插头dp。acm、oi必备= =。 立即下载

相关推荐

从配置文件加载顺序揭秘:为什么你的logback.xml读不到application.yml?

本文深入解析了Spring Boot中logback.xml无法读取application.yml配置的原因,揭示了Spring Boot配置加载机制与日志系统初始化的时序问题。通过对比logback.xml与logback-spring.xml的差异,提供了使用springProperty标签和系统属性传递等解决方案,帮助开发者有效解决日志配置问题。

weixin_29214335的博客 364

Betsy's Tour

题意:摘自NOCOW翻译(http://www.nocow.cn/index.php/Translate:USACO/charrec) 描述 这个问题需要你写一个程序完成字符识别的任务。 每个完整的字符图案有 20 行,20 位。每个位是“0”或“1”。图 1a 对应着输入文件中的符号图案。 文件 font.in 包括了27个字符图案的信息,以这样的顺序记录: _abcd

原味 1250

Gephi实战指南——从数据导入到可视化输出

本文详细介绍了Gephi数据可视化工具的使用方法,从数据导入到可视化输出的全流程实战指南。涵盖Gephi三大工作区功能、数据导入技巧、图形编辑进阶操作以及专业级可视化输出方案,帮助用户高效完成社交网络分析等复杂任务。

weixin_28731223的博客 481

USACO Betsy's Tour 解题报告

大神做了这道题:https://www.byvoid.com/blog/usaco-544-betsys-tour。解释得非常清楚,我也是按照这种方法做的,即统计“bi'jin'din”

thestoryofsnow的专栏 826

DRV2605L触觉驱动芯片实战指南:从自动校准到音频转触觉应用

触觉反馈技术是现代人机交互的核心组成部分,它通过精确控制振动马达来模拟物理触感,广泛应用于智能手机、游戏手柄和汽车触摸屏等领域。其原理在于将电信号转化为机械振动,关键在于如何高效、精准地驱动不同类型的马达(如ERM和LRA)。这项技术的核心价值在于提升交互的真实感和沉浸感。在工程实践中,集成驱动芯片如DRV2605L通过内置智能反馈引擎和自动校准功能,解决了传统驱动方式响应慢、效果不一致的难题。它特别适用于需要高质量触觉反馈的应用场景,例如消费电子、游戏外设和车载信息娱乐系统。其中,自动校准能自适应优化驱动

weixin_42631411的博客 341

【WRF数据介绍第二期】气象驱动场数据介绍及下载

【WRF数据介绍第二期】气象驱动场数据介绍及下载

WW、forever的博客 2160

USACO 5.4 tour的dp解法

题意:有n个点排成序列,两个人甲乙从1出发,到达n,中间的点不允许到达两次,只能从左向右走,问最多两人访问多少点。 (膜大佬) 解: dp f(i, j) 表示甲到了i点,乙到了j点,两人最多访问了多少点。 关键性质:f(i, j) = f(j, i) *** 分析这个问题 (1) f(i, j) = 0 (i == j)   从而i始终不等于j 深入分析这个问题: 甲与...

weixin_30580943的博客 120

Cesium 相机操作

Cesium 提供了三种方式对相机的位置进行摆放。

虎康的博客 2588

usaco6.5.3 Betsy's Tour

一 原题 Betsy's Tour Don Piele A square township has been divided up into N2 square plots (1 <= N <= 7). The Farm is located in the upper left plot and the Market is located in the lower left plot

max_kibble的博客 598

STM32入门教程:WiFi通信

第四步:初始化串口 在生成的代码中,您可以找到一个名为 "USARTx_Init" 的函数,其中 "x" 是您选择的串口号。然后,我们使用 "AT+CIPSEND" 命令发送UDP数据,接收到服务器的回复,并在终端上显示收到的数据。在配置向导中,您可以选择启用USART串口功能,并根据您的硬件连接,将串口设置为与WiFi模块连接的串口。在上述代码中,我们使用了 "HAL_UART_Receive" 函数来接收串口数据,并使用 printf 来在终端上显示收到的数据。如果有任何问题,请随时向我提问。

2401_85258012的博客 1073

推荐系统[八]算法实践总结V3:重排在快手短视频推荐系统中的应用and手淘信息流多兴趣多目标重排技术

快手推荐系统包括了传统的召回、粗排、精排、Learning To Rank 的多目标排序、多目标预估等技术环节。而在这些模块之后的技术环节就属于重排序,主要包括手机端和服务端两部分。服务端通过传统服务器部署重排服务,包括序列重排、多源内容混排、多样性模块。端上部分包括端上重排模型和端上重排策略两部分。重排技术是快手十分重要的技术环节,它的发展速度远快于其他排序环节,属于较新的技术范畴。整个序列的价值并非单 item 效果的累计,如何使得序列价值最大化;

丨汀、的博客 1061

USACO Section 5.4 Betsy's Tour - 搜索剪枝

这道题我一看就觉得是搜~~~最裸的方法是DFS不断找路径了...我想到的剪枝是说一个路径这么走过去..将一个区域圈出来了.那么继续往后搜怎么也不可能满足题目要求走遍所有点了...所以我就在每次走了一步后..对图进行一次BFS...若得到的连在一起的未拓展面积等于理论上的...才继续往下搜..否则就剪枝,立马return...结果交上去过了6个点..第6个点还是0.1秒过的..结果第七个还是过不去.

zzyzzy12 1564

Python量化- Black-Litterman 模型

​​​​​​​Black-Litterman 模型由 Fischer Black 和 Robert Litterman 于 1992 年开发,采用贝叶斯方法进行资产配置。该模型通过结合先前的回报估计(可以从多个来源得出)并结合投资者对未来回报的独特预期来优化分配权重。

探索人工智能领域 1030

USACO Section 5.4 Betsy's Tour

题意: n*n的

House 961

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

[USACO 6.5.3]Betsy's Tour

题目大意   从(1,1)格子开始不重复地经过N*N个格子(包括(1,1)和(N,1))到达(N,1),求路径方案数. 题解   搜索剪枝.   剪枝:     1.当把网格分成两部分时剪枝.     2.走到角的附近时一定走角(N,1)除外. 代码 /* TASK:betsy LANG:C++ */ #include <cstdio> #include ...

weixin_30363981的博客 194

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

*usaco training 5.4.4 Betsy's Tour 题解

【原题】 Betsy's Tour Don Piele A square township has been divided up into N2 square plots (1 <= N <= 7). The Farm is located in the upper left plot and the Market is located in the lower left plot

阿蒋的专栏 2677

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[usaco] 5.4.4 Betsy's Tour

好久没作usaco了。过了个年,人都懒了。 Betsy's Tour Don Piele A square township has been divided up into N2 square plots (1 <= N <= 7). The Farm is located in the upper left plot and the Market is located in the

马云雷的专栏 1103

Betsy's Tour 漫游小镇(dfs)

Description 一个正方形的镇区分为 N2 个小方块(1 <= N <= 7)。农场位于方格的左上角,集市位于左下角。贝茜穿过小镇,从左上角走到左下角,刚好经过每个方格一次。当 N=3 时,贝茜的漫游路径可能如下图所示: ---------------- | | | | | F********** | | | | * | ...

weixin_30384031的博客 405

USACO6.5.3 Betsy's Tour(betsy)

数据范围很小,不用写插头dp,dfs加上强力一些的剪枝就可以ac了,具体都写到代码里了 /* ID:xsy97051 LANG:C++ TASK:betsy */ //数据小,不用插头dp,各种强力剪枝就ok #include #include #include #include using namespace std; bool map[9][9]; int pos[

xsy_victory的专栏 699

USACO 6.5 Betsy's Tour (插头dp)

Betsy's TourDon Piele A square township has been divided up into N2square plots (1 <= N <= 7). The Farm is located in the upper left plot and the Market is located in the lower left plot....

weixin_30295091的博客 282

USACO 5.4 Betsy's Tour(暴力)

水过,水过,这个程序跑7,跑5分钟左右把。。。 1 /* 2 ID: cuizhe 3 LANG: C++ 4 TASK: betsy 5 */ 6 #include <iostream> 7 #include <cstdio> 8 #include <cstring> 9 using namespace std; 10...

weixin_30693683的博客 202

?|USACO 5.4.4|Betsy's Tour|漫游小镇|插头DP

和POJ Tony’s Tour一毛一样。。#include <cstdio> #include <algorithm> #include <map> using namespace std; const int N = 20001, M = 5001; typedef long long ll; typedef map<ll, ll>::iterator mll; const int state[

とある黄鱼のOIブログ 1527

POJ-1739 Tony's Tour 插头DP(单条路径)

  题目链接:http://poj.org/problem?id=1739   完全可以用Ural 1519 Formula 1 插头DP(单回路)的代码解决此题,只要把图修改一下:  .... ........ .... -> .######. .... .#....#. ...

weixin_30821731的博客 157

ACM 146. [USACO Jan08] 贝茜的晨练计划(dp)

146. [USACO Jan08] 贝茜的晨练计划 ★☆   输入文件:cowrun.in   输出文件:cowrun.out   简单对比 时间限制:1 s   内存限制:32 MB 奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行N(1 贝茜的体力限制了她跑步的距离。更具体地,如果贝茜选择在第i分钟内跑步,她可以在这一分钟内跑D_i(1 但她

seektheworld 706

漫游小镇 解题报告

漫游小镇  一个正方形的镇区分为 N2 个小方块(1 写一个程序,对于给出的 N 值,计算贝茜从农场走到集市有多少种唯一的路径。 PROGRAMNAME: betsy INPUTFORMAT 行 1: 一个整数N (1  SAMPLEINPUT (file betsy.in) 3 OUTPUTFORMAT 只有一行。输出一个整数表示唯一路径的数量。

zyf2000 2782
上一篇: USACO 6.5.3 Closed Fences 计算几何
下一篇: USACO 6.5.4 The Clocks BFS
Frontier_Setter
博客等级 码龄10年 2粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值