输出样例1
解题思路
这道题呢,我是用的二分枚举和敌人最小值的距离,然后先预处理每一个点与最近的敌人点的距离,最后搜索就好了。
题解
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=1000,mid;
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 }