Usaco Training [1.3] wormhole
解题要素:代码能力
解题步骤:理解题意 - 》搜索枚举所有可能的配对情况 - 》判断冲突并求解 - 》调试
一. 理解题意
这里讲几个不容易理解的点:
1. +x方向 即向右走
2. 一旦来到虫洞,就必须掉入
二. 搜索枚举所有可能的配对情况
考虑引入match数组,对于当前的节点来说,枚举后面的点是否已配对过即可
int match[N];
inline void dfs(int x) { //当前节点
if (x == n + ) {
rep(i, , n) if (check(i, i, , )) {
ans++;
break;
}
return;
}
if (match[x]) dfs(x + ); //已有匹配,无需枚举
else {
rep(i, x + , n) if (!match[i]) { //枚举
match[i] = x, match[x] = i;
dfs(x + );
match[i] = match[x] = ; //回溯
}
}
}
三. 判断冲突并求解
代码的核心部分,分析当前的一个状态有哪些量是相关的,加上对于题目的理解
int ans;
inline bool check(int begin, int now, int length, int state) { //state - 0 : walk 1 : worm
if (length > && now == begin && state == ) return ; //回到原点了,而且是用走的方式
if (state == ) { //走到虫洞口了就跳进去
check(begin, match[now], length + , );
}
else { //从虫洞d出来,就往前走,如果前面有虫洞,就走过去,没有就返回0
if (a[now].y == a[now + ].y) check(begin, now + , length + , ); else return ;
}
}
四. 调试
1.读入的坐标轴是与正常的行列相反的,在排序和判同行时须格外注意
2.因为奶牛所在初始虫洞处时便掉进去,所以最终只有可能走到虫洞处
最终的代码:
/*
PROG: wormhole
LANG: C++
*/
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = a; i <= b; ++i) const int N = ; int n;
struct node {
int x, y;
}a[N]; bool cmp(const node &a, const node &b) {
return a.y == b.y ? a.x < b.x : a.y < b.y;
} int match[N], ans; inline bool check(int begin, int now, int length, int state) { //state - 0 : walk 1 : worm
if (length > && now == begin && state == ) return ;
if (state == ) {
check(begin, match[now], length + , );
}
else {
if (a[now].y == a[now + ].y) check(begin, now + , length + , ); else return ;
}
} inline void dfs(int x) {
if (x == n + ) {
rep(i, , n) if (check(i, i, , )) {
ans++;
break;
}
return;
}
if (match[x]) dfs(x + );
else {
rep(i, x + , n) if (!match[i]) {
match[i] = x, match[x] = i;
dfs(x + );
match[i] = match[x] = ;
}
}
} int main() {
freopen("wormhole.in", "r", stdin);
freopen("wormhole.out", "w", stdout);
scanf("%d", &n);
rep(i, , n) {
scanf("%d%d", &a[i].x, &a[i].y);
}
sort(a + , a + n + , cmp);
dfs();
printf("%d\n", ans);
return ;
}
Usaco Training [1.3] wormhole的更多相关文章
- 关于USACO Training
做了这么久的题目,突然发现最经典的 USACO Training 还没有做过?加速水一遍吧!我会把题解放在上面的.
- USACO Training Section 1.1 坏掉的项链Broken Necklace
题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...
- USACO Training Section 1.1 贪婪的送礼者Greedy Gift Givers
P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers 题目描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少.在这一个问题中,每个人都准备了一 ...
- USACO Training Section 1.1 Your Ride Is Here
题目描述 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走 ...
- USACO Training Section 1.2 双重回文数 Dual Palindrom
题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做"回文数".例如,12321就是一个回文数,而77778就不是.当然,回文数的首和尾都应是非零的,因此0220就 ...
- Luogu USACO Training 刷水记录
开个坑记录一下刷USACO的Training的记录 可能会随时弃坑 只有代码和做法简述 可能没有做法简述 [USACO1.1]你的飞碟在这儿Your Ride Is He… 模拟,细节已忘 #incl ...
- usaco training 3.4.3 fence9 题解
Electric Fence题解 Don Piele In this problem, `lattice points' in the plane are points with integer co ...
- USACO Training Section 1.1 题解(共4题)
第一题 题目传送门:你的飞碟在这儿 分析 水题一道,输入两个字符串,将它们转换为数字并同时相乘,然后判断一下它们是不是对于47同余就可以了. 代码 #include<bits/stdc++.h& ...
- USACO Training刷题记录 By cellur925
Section 1.1 Your Ride Is Here 貌似没啥可说 Greedy Gift Givers 上来就想stl map映射,有两个坑:如果送给别人的人数为0,那么需要特判一下,防止整数 ...
随机推荐
- spring boot 2.0 thymeleaf调试时正常,打包后运行报错. 找不到模板文件.
使用th:fragment 定义模板 使用 th:replace 来添加模板到需要的地方. 使用时发现一个非常奇怪的问题. 本机idea 调试环境一切正常, 但是打成jar包以后报错,提示找不到对 ...
- .NET开发框架(五)-IIS上部署ASP.NET Core项目教程
系列教程:从初学者到架构师的一步步蜕变 本篇经验将和大家介绍如何在IIS上部署ASP.NET Core项目,希望对初学.NET CORE的童靴入门有所帮助! 1.打开VS,创建项目,选择ASP.NET ...
- 每天学点node系列-http
任何可以使用JavaScript来编写的应用,最终会由JavaScript编写.--Atwood's Law http模块概览 http模块主要用于创建http server服务,并且 支持更多特性 ...
- C++ 洛谷 P1879 [USACO06NOV]玉米田Corn Fields
没学状压DP的看一下 合法布阵问题 P1879 [USACO06NOV]玉米田Corn Fields 题意:给出一个n行m列的草地(n,m<=12),1表示肥沃,0表示贫瘠,现在要把一些牛放在 ...
- python 微信红包生成器
#红包生成思路#200 块钱 10个红包#0-200 的一个轴,随机取9个点,分成10段, 每一段的值表示一个红包的大小 #把输入的 money值 * 100 拿到的数值就是分, 不用再考虑单位是元的 ...
- 关于安装了git或者小乌龟(TortoiseGit)使用之后出现红色! 绿色√ 蓝色?的解决办法:
在当前目录中新建文件保存为(删除git信息.bat)在其写入:for /r . %%a in (.) do @if exist "%%a\.git" rd /s /q " ...
- Spring 注解编程之注解属性别名与覆盖
前两篇文章咱聊了深入了解了 Spring 注解编程一些原理,这篇文章我们关注注解属性方法,聊聊 Spring 为注解的带来的功能,属性别名与覆盖. 注解属性方法 在进入了解 Spring 注解属性功能 ...
- PYTHONIOENCODING = UTF-8 引发的血案
血案: 我就是想在Jenkins上运行一段自动化python代码,就是最简单的本地控制台输出, 我就不懂了它为什么一直是去找 cp1252.py 编码???目前, 确定 pycharm 运行脚本很OK ...
- SpringBoot快速入门01--环境搭建
SpringBoot快速入门--环境搭建 1.创建web工程 1.1 创建新的工程. 1.2 选择maven工程,点击下一步. 1.3 填写groupid(maven的项目名称)和artifacti ...
- .NET Core CSharp初级篇 1-5 接口、枚举、抽象
.NET Core CSharp初级篇 1-5 本节内容类的接口.枚举.抽象 简介 问题 如果你需要表示星期或者是某些状态,使用字符串或者数字是否不直观? 你是否发现,无论何种电脑,它的USB口的设计 ...