水题,不解释。
#include<stdio.h> #include<math.h> #include<cstring> #include<algorithm> #include<iostream> using namespace std; #define N 1000002 struct node { int x,y; int dis; }base[10005],st,end; int n,m; int maps[1005][1005]; bool vis[1005][1005]; int dx[]={0,0,-1,1}; int dy[]={-1,1,0,0}; struct que { struct node t[N]; int head,tail; void init() { head = tail = 0; } bool empty() { return head == tail; } struct node top() { return t[head]; } void push(struct node a) { t[tail] = a; tail ++; if(tail >= N) tail -= N; } void pop() { head ++; if(head >= N) head -= N; } }q; int maxn; int leng; bool isok(int x,int y) { return x>=0&&x<n&&y>=0&&y<m; } void debug_map() { for(int i=0;i<n;i++,puts("")) for(int j=0;j<m;j++) printf("%3d",maps[i][j]); } void bfs() { node tt,tmp; while(!q.empty()) { tmp=q.top(); for(int d=0;d<4;d++) { tt.x=tmp.x+dx[d]; tt.y=tmp.y+dy[d]; tt.dis=tmp.dis+1; if(isok(tt.x,tt.y)&&maps[tt.x][tt.y]==-1) { maps[tt.x][tt.y]=tt.dis; maxn=max(maxn,tt.dis); q.push(tt); } } q.pop(); } } bool cal(int lim) { if(maps[st.x][st.y]<lim) return false; q.init(); q.push(st); node tmp,tt; for(int i=0;i<=n;i++) memset(vis[i],false,sizeof(bool)*(m+1)); while(!q.empty()) { tmp=q.top(); for(int d=0;d<4;d++) { tt.x=tmp.x+dx[d]; tt.y=tmp.y+dy[d]; tt.dis=tmp.dis+1; if(isok(tt.x,tt.y)&&maps[tt.x][tt.y]>=lim&&!vis[tt.x][tt.y]) { vis[tt.x][tt.y]=true; if(tt.x==end.x&&tt.y==end.y) { leng=tt.dis; return true; } q.push(tt); } } q.pop(); } return false; } int main() { int cas; scanf("%d",&cas); st.dis=0; int tt; while(cas--) { q.init(); maxn=0; scanf("%d%d%d",&tt,&n,&m); scanf("%d%d%d%d",&st.x,&st.y,&end.x,&end.y); for(int i=0;i<n;i++) memset(maps[i],-1,sizeof(int)*(m+1)); node t;t.dis=0; for(int i=0;i<tt;i++) { scanf("%d%d",&base[i].x,&base[i].y); maps[base[i].x][base[i].y]=0; t.x=base[i].x; t.y=base[i].y; q.push(t); } bfs(); int l=0,r=n+m; int mid; int ans=0; while(l<=r) { mid=(l+r)/2; if(cal(mid)) {ans=mid;l=mid+1;} else r=mid-1; } printf("%d %d ",ans,leng); } return 0; } /* 3 3 3 0 0 2 1 0 1 1 1 2 */