zoukankan      html  css  js  c++  java
  • 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 }

     

  • 相关阅读:
    输出函数
    curl
    页眉的章名和章名不统一
    水平柱状图
    目录和正文的页码生成
    protobuf的使用
    yarn vue安装
    nvm node的安装
    win安装postman
    机器码
  • 原文地址:https://www.cnblogs.com/937337156Zhang/p/6054684.html
Copyright © 2011-2022 走看看