1 #include<bits/stdc++.h>
2 using namespace std;
3 int k,n,m;
4 int qwe=0;
5 int x1,y_1,x2,y2,ans=0;
6 int mp[1005][1005];//每一個點與最近的敵人的距離
7 bool flag[1005][1005];
8 struct node{
9 int x;
10 int y;
11 int t;
12 };
13 queue<node> s;
14 bool p=true;
15 int dir[4][2]={0,1,0,-1,1,0,-1,0};
16 void bfs1()//初始化每一個點與最近的敵人的距離
17 {
18 while(!s.empty())
19 {
20 node head=s.front();
21 s.pop();
22 for(int i=0;i<4;i++)
23 {
24 int tx=head.x+dir[i][0];
25 int ty=head.y+dir[i][1];
26 if(tx>=0&&ty>=0&&tx<n&&ty<m&&!mp[tx][ty])
27 {
28 mp[tx][ty]=head.t+1;
29 s.push((node){tx,ty,head.t+1});
30 }
31 }
32 }
33 }
34 bool bfs2(int mid)
35 {
36 queue<node> q;
37 memset(flag,0,sizeof(flag));//初始化標記
38 q.push((node){x1,y_1,0});
39 flag[x1][y_1]=true;
40 if(mp[x1][y_1]-1<mid)return false;//首先判斷起點距離
41 while(!q.empty())
42 {
43 node head=q.front();
44 q.pop();
45 if(head.x==x2&&head.y==y2)
46 {
47 ans=head.t;
48 return true;//找到了
49 }
50 for(int i=0;i<4;i++)
51 {
52 int tx=head.x+dir[i][0];
53 int ty=head.y+dir[i][1];
54 if(mp[tx][ty]-1<mid)continue;//由於前面的敵人點是一,因此要減去一
55 if(tx>=0&&ty>=0&&tx<n&&ty<m&&!flag[tx][ty])
56 {
57 flag[tx][ty]=true;//標記
58 q.push((node){tx,ty,head.t+1});
59 }
60 }
61 }
62 return false;//沒找到
63 }
64 int main()
65 {
66 cin>>k>>n>>m;
67 cin>>x1>>y_1>>x2>>y2;
68 for(int i=1;i<=k;i++)
69 {
70 int x,y;
71 scanf("%d%d",&x,&y);
72 mp[x][y]=1;//沒有設置成0是由於後面搜索太麻煩
73 s.push((node){x,y,1});
74 }
75 bfs1();
76 int l=0,r=min(mp[x1][y_1],mp[x2][y2]),mid;//這裏的r不可能比起點或者終點距離敵人的最小值大
77 while(l<r)//二分枚舉距離
78 {
79 mid=(l+r)/2;
80 if(!bfs2(mid))r=mid;
81 else l=mid+1;
82 }
83 cout<<r-1<<" "<<ans;//最後減一 輸出便可
84 }