当前位置: 首页 > news >正文

luogu1556 幸福的路

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

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

相关文章:

  • Win10安装MySQL5.7.22 解压缩版(手动配置)方法
  • Java将图片转换成Base64字符串
  • MyBatis原理-拦截器
  • Django项目 第一课 【nvm、node、npm安装及使用】
  • 牛客网暑期ACM多校训练营(第三场) H Diff-prime Pairs(欧拉筛法)
  • CF 1036 B Diagonal Walking v.2 —— 思路
  • 系统完整性检查工具--Tripwire和AIDE
  • tp5 路由定义
  • 随机图片
  • Vue框架的两种使用方式
  • WPF的x:名称空间
  • 15 个 Android 通用流行框架大全
  • BZOJ1926: [Sdoi2010]粟粟的书架
  • php 进行跨域操作
  • 定义和实现相同的顺序
  • Android 控件背景颜色处理
  • AngularJS指令开发(1)——参数详解
  • CAP 一致性协议及应用解析
  • Java基本数据类型之Number
  • Odoo domain写法及运用
  • React Transition Group -- Transition 组件
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • WebSocket使用
  • yii2权限控制rbac之rule详细讲解
  • 删除表内多余的重复数据
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 学习Vue.js的五个小例子
  • 硬币翻转问题,区间操作
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • ​学习一下,什么是预包装食品?​
  • (30)数组元素和与数字和的绝对差
  • (java)关于Thread的挂起和恢复
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二十三)Flask之高频面试点
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot教学评价 毕业设计 641310
  • (强烈推荐)移动端音视频从零到上手(下)
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)h264中avc和flv数据的解析
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .Mobi域名介绍
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .Net 6.0 处理跨域的方式
  • .Net 8.0 新的变化
  • .Net CF下精确的计时器
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net Remoting常用部署结构
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .net操作Excel出错解决
  • .net与java建立WebService再互相调用