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

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

北京错失铜牌,打铁而归,总是感觉很遗憾,也有点难受,这个题当时场上差一丢丢能出的,后来时间没赶上。                    hihoCoder - 1633(2017北京icpc现场赛-G题)_第1张图片



代码:

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#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;i0?(x):-(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) 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;
}

                                                                                                                                                                               

你可能感兴趣的:(几何+bfs)