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,那么需要特判一下,防止整数 ...
随机推荐
- 在同一页面中显示多个echart图表
整理了一下大概有两种做法来实现在同一个页面中显示多个echart图表,废话不说直接上代码. 在同一个echart对象中绘制多个图表 <!DOCTYPE html> <html lan ...
- 思维导图xmind的使用方法
什么是Xmind Xmind是一款简单好用的思维导图软件,除了可以轻松绘制基本逻辑图,还支持组织结构图(竖直).树状图(水平+竖直).思维导图(辐射).鱼骨图.二维图(表格)模型.免费版可以把思维导图 ...
- TCP/IP协议与OSI体系结构总结
什么是TCP/IP协议?TCP/IP协议不是一个简单的TCP和IP协议,而是个协议族的统称,是网络通信的一套协议集合. TCP/IP协议与OSI七层模型在模块分布上具有一定的区别,OSI参考模型通信协 ...
- Codeforces 755C:PolandBall and Forest(并查集)
http://codeforces.com/problemset/problem/755/C 题意:该图是类似于树,给出n个点,接下来p[i]表示在树上离 i 距离最远的 id 是p[i],如果距离相 ...
- ORACLE常用函数的使用方法
ORACLE常用函数的使用方法 1. 字符串函数 (1) length(); 获取字符长度SELECT LENGTH('中国') FROM PLATFORM_METAINFO_TABLES WHERE ...
- Bzoj 3624: [Apio2008]免费道路 (贪心+生成树)
Sample Input 5 7 2 1 3 0 4 5 1 3 2 0 5 3 1 4 3 0 1 2 1 4 2 1 Sample Output 3 2 0 4 3 0 5 3 1 1 2 1 这 ...
- 七牛云图床和Markdown使用
七牛云图床和Markdown使用 1.图床是什么? 图床一般是指储存图片的服务器,有国内和国外之分.国外的图床由于有空间距离等因素决定访问速度很慢影响图片显示速度.国内也分为单线空间.多线空间和cdn ...
- Apache struts2 Freemarker标签远程命令执行_CVE-2017-12611(S2-053)漏洞复现
Apache struts2 Freemarker标签远程命令执行_CVE-2017-12611(S2-053)漏洞复现 一.漏洞描述 Struts2在使用Freemarker模块引擎的时候,同时允许 ...
- STM32-I2C_CheckEvent-标志位自动清除理解
STM32里I2C_CheckEvent函数我们应该是相当熟悉了,在每次发送数据后我们都需要检验相应的EVx(x = 0,1,2,,,)事件是否有发送. 函数定义如下: ErrorStatus I2C ...
- nginx解析漏洞复现
nginx解析漏洞复现 一.漏洞描述 该漏洞与nginx.php版本无关,属于用户配置不当造成的解析漏洞 二.漏洞原理 1. 由于nginx.conf的如下配置导致nginx把以’.php’结尾的文件 ...