记录编号 117049 评测结果 AAAAAAAAAA
题目名称 [AHOI2005] 穿越磁场 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.063 s
提交时间 2014-08-27 22:21:23 内存使用 97.07 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<set>
#include<queue>
#include<map>
using namespace std;
const int SIZEN=10050,SIZECO=250,INF=0x7fffffff/2;
int N,MX=0;
bool c[SIZEN][SIZEN]={0};
map<int,int> X,Y;
int id[SIZECO][SIZECO]={0};
class POINT{
public:
	int x,y;
	void reassign(void){x=X[x],y=Y[y];}
};
POINT start,end;
POINT rect[SIZEN][2];
void assign(map<int,int> &s){
	int tot=0;
	for(map<int,int>::iterator key=s.begin();key!=s.end();key++)
		key->second=++tot;
	MX=max(MX,tot+1);
}
void discretize(void){
	assign(X),assign(Y);
	for(int i=1;i<=N;i++) rect[i][0].reassign(),rect[i][1].reassign();
	start.reassign(),end.reassign();
}
bool in_rect(int x,int y,int k){
	return x>=rect[k][0].x&&x<rect[k][1].x&&y>=rect[k][0].y&&y<rect[k][1].y;
}
bool test_cross(int x1,int y1,int x2,int y2){
	for(int i=1;i<=N;i++){
		if(in_rect(x1,y1,i)^in_rect(x2,y2,i)) return true;
	}
	return false;
}
bool valid(int x,int y){
	return 0<=x&&x<=MX&&0<=y&&y<=MX;
}
int nowcol;
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
void DFS_color(int x,int y){
	id[x][y]=nowcol;
	for(int d=0;d<4;d++){
		int nx=x+dx[d],ny=y+dy[d];
		if(!valid(nx,ny)||id[nx][ny]) continue;
		if(!test_cross(x,y,nx,ny)) DFS_color(nx,ny);
	}
}
void floodfill(void){
	nowcol=0;
	for(int x=0;x<=MX;x++)
		for(int y=0;y<=MX;y++)
			if(!id[x][y]) nowcol++,DFS_color(x,y);
}
int S,T;
void makegraph(void){
	for(int x=0;x<=MX;x++)
		for(int y=0;y<=MX;y++){
			if(x==start.x&&y==start.y) S=id[x][y];
			if(x==end.x&&y==end.y) T=id[x][y];
			for(int d=0;d<4;d++){
				int nx=x+dx[d],ny=y+dy[d];
				if(!valid(nx,ny)) continue;
				c[id[x][y]][id[nx][ny]]=c[id[nx][ny]][id[x][y]]=true;
			}
		}
}
int f[SIZEN]={0};
void get_dist(void){
	for(int i=1;i<SIZEN;i++) f[i]=INF;
	queue<int> Q;
	f[S]=0;Q.push(S);
	while(!Q.empty()){
		int x=Q.front();Q.pop();
		for(int i=1;i<=nowcol;i++){
			if(!c[x][i]) continue;
			if(f[x]+1<f[i]){
				f[i]=f[x]+1;
				Q.push(i);
			}
		}
	}
}
void read(void){
	scanf("%d",&N);
	int x,y,c;
	for(int i=1;i<=N;i++){
		scanf("%d%d%d",&x,&y,&c);
		X[x]=0,Y[y]=0,X[x+c]=0,Y[y+c]=0;
		rect[i][0]=(POINT){x,y},rect[i][1]=(POINT){x+c,y+c};
	}
	scanf("%d%d",&start.x,&start.y);
	X[start.x]=0,Y[start.y]=0;
	scanf("%d%d",&end.x,&end.y);
	X[end.x]=0,Y[end.y]=0;
}
int main(){
	freopen("cross.in","r",stdin);
	freopen("cross.out","w",stdout);
	read();
	discretize();
	floodfill();
	makegraph();
	get_dist();
	printf("%d\n",f[T]);
	return 0;
}