传送门

解题要素:代码能力

解题步骤:理解题意 - 》搜索枚举所有可能的配对情况 - 》判断冲突并求解 - 》调试

一. 理解题意

  这里讲几个不容易理解的点:

    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的更多相关文章

  1. 关于USACO Training

    做了这么久的题目,突然发现最经典的 USACO Training 还没有做过?加速水一遍吧!我会把题解放在上面的.

  2. USACO Training Section 1.1 坏掉的项链Broken Necklace

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  3. USACO Training Section 1.1 贪婪的送礼者Greedy Gift Givers

    P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers 题目描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少.在这一个问题中,每个人都准备了一 ...

  4. USACO Training Section 1.1 Your Ride Is Here

    题目描述 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走 ...

  5. USACO Training Section 1.2 双重回文数 Dual Palindrom

    题目描述 如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做"回文数".例如,12321就是一个回文数,而77778就不是.当然,回文数的首和尾都应是非零的,因此0220就 ...

  6. Luogu USACO Training 刷水记录

    开个坑记录一下刷USACO的Training的记录 可能会随时弃坑 只有代码和做法简述 可能没有做法简述 [USACO1.1]你的飞碟在这儿Your Ride Is He… 模拟,细节已忘 #incl ...

  7. usaco training 3.4.3 fence9 题解

    Electric Fence题解 Don Piele In this problem, `lattice points' in the plane are points with integer co ...

  8. USACO Training Section 1.1 题解(共4题)

    第一题 题目传送门:你的飞碟在这儿 分析 水题一道,输入两个字符串,将它们转换为数字并同时相乘,然后判断一下它们是不是对于47同余就可以了. 代码 #include<bits/stdc++.h& ...

  9. USACO Training刷题记录 By cellur925

    Section 1.1 Your Ride Is Here 貌似没啥可说 Greedy Gift Givers 上来就想stl map映射,有两个坑:如果送给别人的人数为0,那么需要特判一下,防止整数 ...

随机推荐

  1. IDEA中Maven依赖包下载不了的问题解决方案汇总

    第一种方案: 第二种方案:下面的几个不要选择. 第三种方案:可能是某一个 dependency 依赖无法下载,导致整个项目都报错 打开具体的报错的maven项目的pom.xml.试着去删除一些 dep ...

  2. 微服务-springboot热部署

    spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用. IDEA进行热 ...

  3. 并发编程-concurrent指南-原子操作类-AtomicReference

    1.类 AtomicReference<V> public class AtomicReference<V>extends Objectimplements Serializa ...

  4. 2018.8.17 2018暑假集训 关于dp的一些感想(以目前的知识水平)

    学了这么长时间的dp似乎还是不怎么样 谨以此篇文字记录一年以来与dp斗智斗勇的各种经历 关于dp(也就是动态规划)似乎对于每个OIer来说都是一个永远的噩梦. 刚刚开始学dp的时候完全搞不明白(只是觉 ...

  5. Codeforces 760C:Pavel and barbecue(DFS+思维)

    http://codeforces.com/problemset/problem/760/C 题意:有n个盘子,每个盘子有一块肉,当肉路过这个盘子的时候,当前朝下的这一面会被煎熟,每个盘子有两个数,p ...

  6. SQL系统优化

    1 系统优化介绍 在我们的项目中,由于客户的使用时间较长或客户的数据量大,造成系统运行速度慢,系统性能下降就容易造成数据库阻塞.这是个非常痛苦的事情,用户的查询.新增.修改等需要花很多时间,甚至造成系 ...

  7. C#语言注释详解

    C#语言注释有三种形式 C#语言注释有三种形式 第一种是多行注释: /*  */ 例如: /* int a=1; int b=2; int c=3; */// 第二种是单行注释: 例如: // int ...

  8. 基于C#的机器学习--微基准测试和激活功能

    本章我们将学习以下内容: l  什么是微基准测试 l  如何将它应用到代码中 l  什么是激活函数 l  如何绘制和基准测试激活函数 每个开发人员都需要有一个好的基准测试工具.质量基准无处不在;你们每 ...

  9. 如何在vue中监听scroll,从而实现滑动加载更多

    首先需要明确3个定义: 文档高度:整个页面的高度 可视窗口高度:你看到的浏览器可视屏幕高度 滚动条滚动高度: 滚动条下滑过的高度 当 文档高度 = 可视窗口高度 + 滚动条高度  时,滚动条正好到底. ...

  10. 【栈-例题】网页跳转-C++

    描述 蒜头君每天都在用一款名为 "蒜厂浏览器" 的软件.在这个浏览器中,一共三种操作:打开页面.回退和前进.它们的功能如下: 打开页面:在地址栏中输入网址,并跳转到网址对应的页面: ...