注意到\(n\le10\),所以枚举经过的拐弯牛的所有排列。

注意到STL是一个好东西,所以我这里偷懒直接使用了next_permutation

枚举所有n的排列,对于每一个排列也就是经过拐弯牛的顺序,我们要判断两点:

  • 一个是相邻的两个牛(以及从(0,0)到第一个牛,和从最后一个牛到(0,0))的路径是否平行坐标轴,这个直接判相等即可。
  • 还有一个是要判断经过每一头牛是否拐弯了,对于第p头牛我们可以计算从第p-1头牛(当p=1就是原点)到第p头牛的路径向量,和第p头牛到第p+1头牛(当p=n就是远点)的路径向量,通过两个向量的点积就可以方便地判断是否转弯,由于我们已经判断了是否垂直平行坐标系,所以点积为0说明转弯90度,点积小于0说明掉头,点积大于0说明没有转弯。

然后答案就是合法的n的排列的个数

#include <bits/stdc++.h>
using namespace std; struct coord
{
int x, y;
}c[12]; int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int n, ans; bool work()
{
//上一次的坐标
int lx = 0, ly = 0;
for (int i = 0; i < n; i++)
{
int p = a[i];
int x = c[p].x, y = c[p].y;//本次的坐标
int nx = c[a[i + 1]].x, ny = c[a[i + 1]].y;//下一次的坐标
//判断路径是否平行于坐标轴
if(((lx == x) || (ly == y)) == 0)
return false;
if(((nx == x) || (ny == y)) == 0)
return false;
//1和2是两个向量
int x1 = x - lx, y1 = y - ly;
int x2 = nx - x, y2 = ny - y;
if((x1 * x2 + y1 * y2 > 0))//计算点积
{
return false;
}
lx = x;//更新坐标
ly = y;
}
return true;
} int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d%d", &c[i].x, &c[i].y);
a[n] = n;
do
ans += work();
while (next_permutation(a, a + n));
printf("%d\n", ans);
return dou;
}

让我们一起膜拜大佬林瑞堂@olinr

luogu1556 幸福的路的更多相关文章

  1. 洛谷P1556 幸福的路

    P1556 幸福的路 题目描述 每天,John都要为了农场里N(1≤N≤10)头牛的健康和幸福四处奔波. 每头牛的位置可以描述为一个二维坐标,John从坐标原点(0,0)出发.为了使路径更有趣,Joh ...

  2. 洛谷 P1556 幸福的路

    P1556 幸福的路 题目描述 每天,John都要为了农场里N(1≤N≤10)头牛的健康和幸福四处奔波. 每头牛的位置可以描述为一个二维坐标,John从坐标原点(0,0)出发.为了使路径更有趣,Joh ...

  3. P1556 幸福的路

    题意:平面内有N头牛$N\le 10$john从(0,0)出发,最后回到(0,0) 只有走到牛那里john才可以改变方向,否则沿着直线走 问john经过每一头牛并且在每一头牛出恰好改变方向一次的方案( ...

  4. 博客索引and题目列表

    目录 笔记整理 计划 要学的东西 缺省源 要做的题 搜索 高斯消元 矩阵 排列组合 2019.7.9 2019.7.10 kmp ac自动机 2019.7.11 2019.7.15 笔记整理 1.同余 ...

  5. Adapter的封装之路

    原文:Adapter的封装之路 一.几种常见列表效果: 假如要用RecyclerView实现下面的几种效果,你会如何实现呢? 效果1:单布局效果   效果2:多布局效果 有多种Item布局   效果3 ...

  6. 见证历史 -- 2013 NBA 热火夺冠之路有感

    见证历史-- 2013 NBA 热火夺冠之路有感今年NBA季后赛从第一轮看起,到最终的热火夺冠,应该看得是最爽的一次.但一些情节和细节,回忆起来,深有感悟. 1. 做人要低调詹宁斯豪言演黑八雄鹿本赛季 ...

  7. 通向高可扩展性之路(WhatsApp篇)---- 脸书花了190亿买来的WhatsApp的架构

    原文链接:http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-bill ...

  8. 屠蛟之路_集木成舟_ForthDay

    下数据库大山,行数里至水岸,无边无际的东海便豁然展现在屠蛟少年的眼前. 要想到达东海之中的蛟灵岛绞杀beta怪蛟,夺回心爱的小公举,少年们首先需要一艘经得起风浪的船.毕竟海上之路暗涌潜伏.同样凶险万分 ...

  9. 《少有人走的路:心智成熟的旅程》--[美]M·斯科特·派克

    <少有人走的路>,美国作家M·斯科特·派克所著 下面是我的书摘: * 归根到底,它告诉我们怎样找到真正的自我. * 人可以拒绝任何东西,但绝对不可以决绝成熟.决绝成熟,实际上就是在规避问题 ...

随机推荐

  1. 对runtime的总结:让你会用Runtime

    导语Runtime,简称运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制,是一套底层的纯C语言的API,我们平时所编写的OC代码,在程序的运行过程中都转成了runtime的代码,平时调方 ...

  2. OpenGL渲染流水线

    其实OpenGL的流水线,对我学习来说只能算是一个概念性的东西.毕竟OpenGL也在发展,流水线也不会是一成不变的. 不过理解流水线的过程,重点在于理解每一步的作用,进而可以如何衔接起来,完成整个绘制 ...

  3. NodeJs之文件合并(某一文件的内容发生变化与之相关的内容重新合并)

    首先,一个文件里面的内容是由多个文件共同组成的.例如一个文件夹包含有多文件(文件夹) 然后,当其中一个发生变化时所用与之有直接作用的文件(文件夹)都会重新组合. /*注意:该例子需要在同级目录下完成及 ...

  4. Don’t panic, it’s just a kernel panic (ZT)

    http://blog.kreyolys.com/2011/03/17/no-panic-its-just-a-kernel-panic/ One of the main young sysadmin ...

  5. oracle connect by用法篇 (包括树遍历)之一

    1.基本语法 select * from table [start with condition1] connect by [prior] id=parentid 一般用来查找存在父子关系的数据,也就 ...

  6. Android指针管理:RefBase,SP,WP (二)

    (1)在Android中,RefBase结合了sp和wp,实现了一套通过引用计数的方法来控制对象声明周期的方法. RefBase的定义在/frameworks/base/include/utils/R ...

  7. oracle create user &tablespace & imp

    一.表空间 1.创建表空间 CREATE TABLESPACE 空间名称 DATAFILE '文件名1' SIZE 数字M [,'文件名2' SIZE 数字….] EXTENT MANAGEMENT ...

  8. MyBatis总结一:快速入门

    简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 ...

  9. ld 链接选项-L,-rpath-link,-rpath

    转载自:http://blog.csdn.net/q1302182594/article/details/42102961 1. 三个C文件 1. world.c #include<stdio. ...

  10. 对private protected public的详解:

    #include <iostream> #include <stack> #include <queue> #include <exception> # ...