NOIP模拟题——tractor
1. tractor
题目描述
农场上有N(1 <= N <= 50,000)堆草,放在不同的地点上。FJ有一辆拖拉机,也在农场上。拖拉机和草堆都表示为二维平面上的整数坐标,坐标值在1..1000的范围内。拖拉机的初始位置与所有草堆不同。
FJ开拖拉机时,只能平行于坐标轴(即东、南、西、北四个方向),而且每次开动的一段必须是整数长度。
例如,他可以向北开2个单位长度,然后向东开3个单位长度。拖拉机不能开到草堆的位置。
请帮助FJ计算出最少要移动多少个草堆,他才能将拖拉机开回坐标原点。
拖拉机可以开到1..1000之外的地方去。
输入
第1行: 3个整数,即N 和拖拉机的初始位置 (x,y)
第2..1+N行: 每行2个整数,表示一堆草的位置 (x,y)
输出
第1行: FJ必须移动的最少的草堆的数量
样例输入
7 6 3
6 2
5 2
4 3
2 1
7 3
5 4
6 4
样例输出
1
Time limit
1s
Memory limit
256M
提示
样例说明:拖拉机初始在(6,3),7堆草分别在 (6,2), (5,2), (4,3), (2,1), (7,3), (5,4), (6,4).
FJ必须移动一堆草
***********************************************************************
只要走到边界,则不花代价即可。用到BFS。
1 #include<cstdio>
2 #include<iostream>
3 #include<cstring>
4 #include<queue>
5 using namespace std;
6 int n,startx,starty;
7 int a[50005],b[50005];
8 bool map[1005][1005];
9 int dx[4]={1,-1,0,0};
10 int dy[4]={0,0,1,-1};
11 int dis[1005][1005];
12 int inq[1005][1005];
13 int q1[1005*1005*10];
14 int q2[1005*1005*10];
15 int head=0,tail=1;
16 inline void bfs(int x,int y)
17 {
18 inq[x][y]=true;
19 q1[1]=x;q2[1]=y;
20 while(head<tail)
21 {
22 head++;
23 int x1=q1[head],x2=q2[head];
24
25 inq[x1][x2]=false;
26 for(int i=0;i<=3;i++)
27 {
28 int u1=x1+dx[i],u2=x2+dy[i];
29 if(u1>1001||u1<0||u2>1001||u2<0) continue ;
30 if(map[x1][x2]==true)
31 {
32 if(dis[u1][u2]>dis[x1][x2]+1)
33 {
34 dis[u1][u2]=dis[x1][x2]+1;
35 if (inq[u1][u2]==false)
36 {
37 inq[u1][u2]=true;
38 q1[++tail]=u1;q2[tail]=u2;
39 }
40 }
41 }
42 else
43 {
44 if(dis[u1][u2]>dis[x1][x2])
45 {
46 dis[u1][u2]=dis[x1][x2];
47 if (inq[u1][u2]==false)
48 {
49 inq[u1][u2]=true;
50 q1[++tail]=u1;q2[tail]=u2;
51 }
52 }
53 }
54 }
55 }
56
57 return ;
58 }
59 int main()
60 {
61 freopen("tractor.in","r",stdin);
62 freopen("tractor.out","w",stdout);
63 scanf("%d%d%d",&n,&startx,&starty);
64 for(int i=1;i<=n;i++)
65 {
66 scanf("%d%d",&a[i],&b[i]);
67 map[a[i]][b[i]]=true;
68 }
69 memset(dis,127,sizeof(dis));
70 dis[startx][starty]=0;
71 bfs(startx,starty);
72 int ans=99999999;
73 for(int i=0;i<=1000;i++)
74 {
75 ans=min(ans,dis[i][0]);
76 ans=min(ans,dis[0][i]);
77 ans=min(ans,dis[i][1001]);
78 ans=min(ans,dis[1001][i]);
79 }
80 printf("%d",ans);
81 return 0;
82 }