必威体育Betway必威体育官网
当前位置:首页 > IT技术

hihoCoder - 1633(2017北京icpc现场赛-G题)

时间:2019-10-18 05:43:15来源:IT技术作者:seo实验室小编阅读:55次「手机版」
 

hihocoder

题意:给你一个三角形的三个坐标,还有一张图,让你从图中的左下角走到右上角,左下角坐标是(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;
    else
        return 0;

}
int same(point p1,point p2)
{
    if(p1.x==p2.x&&p1.y==p2.y)
        return 1;
    else
        return 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;
                         else
                            return 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;
}

                                                                                                                                                                       

相关阅读

百度分享代码--一键分享Baidu Share BEGIN

http://share.baidu.com/code/advance 一、概述 百度分享代码已升级到2.0,本页将介绍新版百度分享的安装配置方法,请点击左侧列表

(七)Thymeleaf的 th:* 属性之—— th: ->设值& 遍历迭代

转载自:https://www.cnblogs.com/zjfjava/p/6893607.html 3.4 属性值的设置 3.4.1 使用th:attr来设置属性的值 <form action="

hera(赫拉)任务调度系统--为数据平台打造的任务调度系

hera(赫拉)任务调度系统–为数据平台打造的任务调度系统 hera项目背景  在大数据平台,随着业务发展,每天承载着成千上万的ETL任务

U-DIMM、SO-DIMM、FB-DIMM、Reg-DIMM区别

U-DIMM [Unbuffered DIMM]Unbuffered Memory中文意思可以理解为不带缓存的内存,也就是说在内存条PCB上没有缓存(buffer)或寄存器(regi

炉石传说狂野乱斗极速12-0佛祖骑最强卡组推荐

炉石传说狂野乱斗极速12-0佛祖骑最强卡组推荐,狂野乱斗极速12-0佛祖骑卡组是最新推出的,那么炉石传说狂野乱斗极速12-0佛祖骑怎么卡

分享到:

栏目导航

推荐阅读

热门阅读