题意:给你一个三角形的三个坐标,还有一张图,让你从图中的左下角走到右上角,左下角坐标是(0,0),每两点之间的长度是1,'.'代表能走,'#'代表不能走,并且每条路径不能碰到三角形内部,让你求最短路径长度。

北京错失铜牌,打铁而归,总是感觉很遗憾,也有点难受,这个题当时场上差一丢丢能出的,后来时间没赶上。                    

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <stack>
#include <vector>
#include <queue>
#define ri(n) scanf("%d",&n)
#define oi(n) printf("%d\n",n)
#define rl(n) scanf("%lld",&n)
#define ol(n) printf("%lld\n",n)
#define rep(i,l,r) for(i=l;i<=r;i++)
#define rep1(i,l,r) for(i=l;i<r;i++)
#define eps 1e-8
#define zero(x)(((x)>0?(x):-(x))<eps)
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int epg=10-8;
int vis[1000][1000];
int dx[]={-1,0,1,-1,1,-1,0,1};
int dy[]={1,1,1,0,0,-1,-1,-1};
int n,m;
int maps[1000][1000];
char s[1000][1000];
struct node
{int x,y;int step;node(int a,int b,int c):x(a),y(b),step(c){}
};
struct Point
{double x;double y;
};
typedef struct Point point;
point p1,p2,p3;
double multi(point p0,point p1,point p2)//叉积
{return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
bool isIntersected(point s1,point e1,point s2,point e2)//两线段交,不包括端点相交
{return (max(s1.x,e1.x)>=min(s2.x,e2.x)) &&(max(s2.x,e2.x)>=min(s1.x,e1.x)) &&(max(s1.y,e1.y)>=min(s2.y,e2.y)) &&(max(s2.y,e2.y)>=min(s1.y,e1.y)) &&(multi(s1,s2,e1)*multi(s1,e1,e2)>0) &&(multi(s2,s1,e2)*multi(s2,e2,e1)>0);
}
double xmult(point p1,point p2,point p0)
{return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}int dot_online_in(point p,point l1,point l2)//判断点在线段上,包括端点
{return zero(xmult(p,l1,l2))&&(l1.x-p.x)*(l2.x-p.x)<eps&&(l1.y-p.y)*(l2.y-p.y)<eps;
}
double area(point p1,point p2,point p3)//求三角形面积
{return  abs((p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x))/2.0;
}
int pansan(point e)//判断点在三角形内部
{if(!dot_online_in(e,p1,p2)&&!dot_online_in(e,p2,p3)&&!dot_online_in(e,p3,p1)&&(area(e,p1,p2)+area(e,p2,p3)+area(p3,p1,e)<area(p1,p2,p3)+eps))return 1;elsereturn 0;}
int same(point p1,point p2)
{if(p1.x==p2.x&&p1.y==p2.y)return 1;elsereturn 0;
}
int pan(point p1,point p2,point p3,point e1,point e2)
{if(isIntersected(p1,p2,e1,e2)||isIntersected(p2,p3,e1,e2)||isIntersected(p3,p1,e1,e2))return 0;else{//int flag1=0,flag2=0;if((same(e1,p1)&&!same(e2,p2)&&!same(e2,p3)&&dot_online_in(e2,p2,p3))||(same(e1,p2)&&!same(e2,p1)&&!same(e2,p3)&&dot_online_in(e2,p1,p3))||(same(e1,p3)&&!same(e2,p1)&&!same(e2,p2)&&dot_online_in(e2,p1,p2))||(same(e2,p1)&&!same(e1,p2)&&!same(e1,p3)&&dot_online_in(e1,p2,p3))||(same(e2,p2)&&!same(e1,p1)&&!same(e1,p3)&&dot_online_in(e1,p1,p3))||(same(e2,p3)&&!same(e1,p1)&&!same(e1,p2)&&dot_online_in(e1,p1,p2)))return 0;else{if(((dot_online_in(e1,p1,p2)||dot_online_in(e1,p2,p3)||dot_online_in(e1,p3,p1))&&pansan(e2))||((dot_online_in(e2,p1,p2)||dot_online_in(e2,p2,p3)||dot_online_in(e2,p3,p1))&&pansan(e1)))return 0;else{if((!same(e1,p1)&&!same(e1,p2)&&dot_online_in(e1,p1,p2)&&( (!same(e2,p1)&&!same(e2,p3)&&dot_online_in(e2,p1,p3))||(!same(e2,p2)&&!same(e2,p3)&&dot_online_in(e2,p2,p3))))||(!same(e1,p2)&&!same(e1,p3)&&dot_online_in(e1,p2,p3)&&( (!same(e2,p1)&&!same(e2,p3)&&dot_online_in(e2,p1,p3))||(!same(e2,p2)&&!same(e2,p1)&&dot_online_in(e2,p2,p1))))||(!same(e1,p3)&&!same(e1,p1)&&dot_online_in(e1,p3,p1)&&( (!same(e2,p1)&&!same(e2,p2)&&dot_online_in(e2,p1,p2))||(!same(e2,p2)&&!same(e2,p3)&&dot_online_in(e2,p2,p3)))))return 0;else{if(pansan(e1)||pansan(e2))return 0;else{if(  ((dot_online_in(p1,e1,e2)&&!same(e1,p1)&&dot_online_in(e2,p2,p3)&&!same(e2,p2)&&!same(e2,p3))||(dot_online_in(p1,e1,e2)&&!same(e2,p1)&&dot_online_in(e1,p2,p3)&&!same(e1,p2)&&!same(e1,p3)))||((dot_online_in(p2,e1,e2)&&!same(e1,p2)&&dot_online_in(e2,p1,p3)&&!same(e2,p1)&&!same(e2,p3))||(dot_online_in(p2,e1,e2)&&!same(e2,p2)&&dot_online_in(e1,p1,p3)&&!same(e1,p1)&&!same(e1,p3)))||((dot_online_in(p3,e1,e2)&&!same(e1,p3)&&dot_online_in(e2,p1,p2)&&!same(e2,p1)&&!same(e2,p2))||(dot_online_in(p3,e1,e2)&&!same(e2,p3)&&dot_online_in(e1,p1,p2)&&!same(e1,p1)&&!same(e1,p2))))return 0;elsereturn 1;}//return 1;}}//return 1;}}
}
int bfs(){memset(vis,false,sizeof(vis));queue<node> q;vis[0][0] = true;q.push(node(0,0,0));while(!q.empty()){node p = q.front();q.pop();int nx,ny;for(int i = 0 ; i < 8 ; i ++){nx = p.x + dx[i];ny = p.y + dy[i];if(nx < 0 || nx >= n || ny < 0 || ny >= n)continue;if(maps[nx][ny] == '#' || vis[nx][ny])continue;Point q1,q2;q1.x = p.x;q1.y = p.y;q2.x = nx;q2.y = ny;//cout << "p.x = " << p.x << " p.y = " << p.y << endl;if(pan(p1,p2,p3,q1,q2)){vis[nx][ny] = true;//cout << "nx = " << nx << " ny = " << ny << endl;q.push(node(nx,ny,p.step+1));if(nx == n-1 && ny == n-1){return p.step+1;}}}}return -1;
}
int main()
{while(scanf("%d",&n) != EOF){cin>>p1.x>>p1.y>>p2.x>>p2.y>>p3.x>>p3.y;//cin>>p1.y>>p1.x>>p2.y>>p2.x>>p3.y>>p3.x;for(int i = 0 ; i < n ; i ++){scanf("%s",s[i]);}for(int i = 0 ; i < n ; i ++){for(int j = 0 ; j < n ; j ++){maps[i][j] = s[n-1-j][i];//maps[i][j] = s[i][j];}}// for(int i = 0 ; i < n ; i ++){//    for(int j = 0 ; j < n ; j ++){//      cout << maps[i][j];//     }//     cout << endl;// }cout << bfs() << endl;}return 0;
}

hihoCoder - 1633(2017北京icpc现场赛-G题)相关推荐

  1. 2017ACM-ICPC北京区域现场赛 G题 hihocoder1633

    传送门:点击打开链接 题意:一个N*N的网格,从左下角走到右上角需要的最短步数.要求不能经过# 而且路径不能经过一个三角形的内部,可以沿边走. 分析:计算几何题里不算难题,但若没想到坑点就一直卡题了. ...

  2. (每日一题)2016 北京ICPC网络赛G hihocoder 1388 (中国剩余定理 + NTT)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://vjudge.net/problem/HihoCoder-1388 P ...

  3. ZOJ-3964 2017年浙大省赛G题博弈

    先记录下心情,其实在看大佬题解前,自己已经基本yy出来了,但有一两个点没处理好,就只能放弃,亟待加油啊~ 本题思路: 特判bi为1或者为2时的情况, ① 当bi = 1 && ai = ...

  4. 5_竞赛无人机搭积木式编程——以2021年电赛G题植保无人机国奖标准完整复现为例学习

    竞赛无人机搭积木式编程 --以2021年电赛G题植保无人机国奖标准完整复现为例学习 首先我们需要了解下自动飞行任务执行过程几组关键变量的用法与实际作用效果: flight_subtask_cnt用于控 ...

  5. 2020icpc上海赛G题 Fibonacci详解

    Fibonacci(icpc2020上海赛) 链接:icpc2020上海赛G题Fibonacci 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语 ...

  6. 2017北京ICPC -G - Liaoning Ship’s Voyage (HihoCoder - 1633)几何

    题目网址https://cn.vjudge.net/problem/HihoCoder-1633 比赛的时候只是想到了,将三角形内部的点换成#,然后与三角形严格相交的走法的线段不可行,但是端点相交是可 ...

  7. 2017ICPC北京现场赛G Liaoning Ship’s Voyage(BFS+点在多边形内判定)

    题目链接:https://cn.vjudge.net/problem/HihoCoder-1633 题意:有一个nxn的海域,海域上有两类点,一种是点,一种是#,#不可以走,还有给你三个顶点坐标(可能 ...

  8. [2018北京ICPC网络赛H] HihoCoder - 1835 K-Dimensional Foil II(点到平面的距离)

    题目链接: 点击前往 题目: 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 "K-Dimensional Foil" is a dimensional ...

  9. 2015北京网络赛 G题 Boxes bfs

    Boxes Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc2015beijingonl ...

最新文章

  1. TP-GAN 侧脸修复
  2. C++对象内存布局--⑤GCC编译器--单个虚拟继承
  3. 游戏中的卡片模态面板设计【1】—运用案例分析
  4. vertx web连接超时 阻塞_Flink之基于Vertx的Mysql异步IO
  5. 文件流、目录流、文件描述符总结
  6. linux下基于Posix message queue的同步消息队列的实现
  7. 用标准C语言初始化线性表,跪求:线性表初始化函数的详细解释(c语言)
  8. 最短Hamilton路径(位运算基本思路)
  9. [ExtJS5学习笔记]第22 Extjs5正在使用beforeLabelTpl添加所需的配置选项标注星号标记...
  10. CSS与CSS3美化页面
  11. Javaweb面试题(一)———更新中
  12. IE插件加载题目调试
  13. 如何创建谷歌邮箱(Gmail)
  14. 明翰英语教学系列之音标篇V0.2(持续更新)
  15. Lee滤波和Refine-Lee滤波
  16. 有限角度层析成像重建:基于无监督正弦图适应的合成重建
  17. React 项目兼容低版本浏览器
  18. 网络运维python之NETCONF--协程gevent+ncclient,2分钟巡检几千台华为CE交换机
  19. app毕业设计 基于uni-app框架商城app、图书商城app毕设题目课题选题作品(2)后台管理功能
  20. 想跟应届毕业生聊聊的三个话题

热门文章

  1. 2016小米校招笔试题
  2. 知识分享!COB封装流程介绍!-道合顺大数据Infinigo
  3. 基于STM32(HAL库)的水质检测(浑浊度、PH值、温度、手机APP显示、wifi上云)
  4. 互联网音乐告别版权战,音乐社区或成新风口?
  5. 【吴恩达deeplearning.ai】Course 5 - 3.3 集束搜索
  6. 2017 终点亦是起点
  7. Ubuntu中添加新硬盘
  8. 中国连锁药店行业发展机遇与竞争格局分析报告2022-2028年版
  9. 点卯.三维视频融合助力国家全面推进实景三维中国建设, 构建数字中国建设基座 ;开放C++源代码 点卯-魔镜系列
  10. 四足机器人的六种步态特征