Nwerc 2006【escape】

描述

給出數字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),表明有N個敵人分佈一個X行Y列的矩陣上
矩形的行號從0到X-1,列號從0到Y-1再給出四個數字x1,y1,x2,y2,表明你要從點(x1,y1)移到(x2,y2)。
在移動的過程當中你固然但願離敵人的距離的最小值最大化,如今請求出這個值最大能夠爲多少,以及在這個前提下
你最少要走多少步才能夠回到目標點。注意這裏距離的定義爲兩點的曼哈頓距離,即某兩個點的座標分爲(a,b),(c,d)
那麼它們的距離爲|a-c|+|b-d|。

輸入

第一行給出數字N,X,Y
第二行給出x1,y1,x2,y2
下面將有N行,給出N個敵人所在的座標

輸出

在一行內輸出你離敵人的距離及在這個距離的限制下,你回到目標點最少要移動多少步。

輸入輸出樣例

輸入樣例1

2 5 6
0 0 4 0
2 1
2 3

輸出樣例1

2 14

解題思路

  這道題呢,我是用的二分枚舉和敵人最小值的距離,而後先預處理每個點與最近的敵人點的距離,最後搜索就行了。node

題解

 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 }
相關文章
相關標籤/搜索