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 }

 

原文地址:https://www.cnblogs.com/937337156Zhang/p/6054684.html