博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu1556 幸福的路
阅读量:5013 次
发布时间:2019-06-12

本文共 1359 字,大约阅读时间需要 4 分钟。

注意到\(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 
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;}

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

转载于:https://www.cnblogs.com/oier/p/9596631.html

你可能感兴趣的文章
MySQL服务启动:某些服务在未由其他服务或程序使用时将自动停止
查看>>
软件工程第四周作业 - 单元测试
查看>>
KNN与SVM对比&SVM与逻辑回归的对比
查看>>
php 现在拓展地址
查看>>
【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)...
查看>>
团队个人冲刺第三天
查看>>
unit
查看>>
2017-10-17 NOIP模拟赛2
查看>>
How to install ia32-libs in Ubuntu 14.04 LTS (Trusty Tahr)
查看>>
ACM/ICPC 之 模拟 (HNUOJ 13391-换瓶模拟)
查看>>
JavaWeb学习——JSP基础
查看>>
Eclipse tomcat server 无法添加项目
查看>>
黑寡妇黄飞鸿
查看>>
leetcode 217 Contains Duplicate 数组中是否有重复的数字
查看>>
The Ctrl & CapsLock `problem'
查看>>
MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
查看>>
linux故障判断
查看>>
Leetcode 23. Merge k Sorted Lists(python)
查看>>
Java进阶知识点6:并发容器背后的设计理念 - 锁分段、写时复制和弱一致性
查看>>
Makefile ===> Makefile 快速学习
查看>>