传送门

解题要素:代码能力

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

一. 理解题意

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

    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. storm资源冲突

    本方案出自<storm应用实践:实时事务处理之策略>,简略的写了一部分,详细的方法就看书吧 1)集群中工作进程冲突: 解决:通过查看stormUI cluster summary中的fre ...

  2. POJ 3581:Sequence(后缀数组)

    题目链接 题意 给出n个数字的序列,现在让你分成三段,使得每一段翻转之后拼接起来的序列字典序最小.保证第一个数是序列中最大的数. 例如样例是{10, 1, 2, 3, 4},分成{1, 10}, {2 ...

  3. VueRouter认识

    1. 什么是路由? 路由(vue-router)是负责将进入的浏览器请求映射到特定的 组件 代码中.即决定了由谁(组件)去响应客户端请求.简单说路由就是url地址和对应的资源的映射,通过一个路径的ur ...

  4. C语言实现—学生成绩管理系统(Linux下运行)

    开发环境:Linux 开发语言:C 相关文件下载: 码云:https://gitee.com/ikaros-521/c_project/tree/master/%E5%AD%A6%E7%94%9F%E ...

  5. 自己实现定制自己的专属java锁,来高效规避不稳定的第三方

    java juc 包下面已经提供了很多并发锁工具供我们使用,但在日常开发中,为了各种原因我们总是会用多线程来并发处理一些问题,然而并不是所有的场景都可以使用juc 或者java本身提供的锁来方便的帮助 ...

  6. SQL Server Update 链接修改和when的应用

    一.自链接方式 update b1 set b1.money = b1.money + b2.money from (select * from wallet where type='余额') b1 ...

  7. Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现

    Apache struts2远程命令执行_CVE-2017-9805(S2-052)漏洞复现 一.漏洞概述 Apache Struts2的REST插件存在远程代码执行的高危漏洞,Struts2 RES ...

  8. 提升布局性能____Making ListView Scrolling Smooth

    listview是一个比较重要的UI组件,一切影响UI的操作,比如适配器从磁盘.网络或者数据库中加载数据的操作,最好都放在子线程中完成.子线程可以使用thread,不过那样比较老土,官方推荐使用Asy ...

  9. CSDN怎么一键转载别人的博客

    在参考"如何快速转载CSDN中的博客"后,由于自己不懂html以及markdown相关知识,所以花了一些时间来弄明白怎么转载博客,以下为转载CSDN博客步骤和一些知识小笔记. 参考 ...

  10. linux 安装命令 nginx 部署

    [TOC] # 安装anocanda wget https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh安装:bash A ...