第一次交,我 WA 96,#9 不对。
代码:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const ll Inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n,sx,sy;
char mp[55][55];
long long h[55][55];
long long ssk,cnt,ans=Inf,hmax,hmin,vis[55][55];
int dx[]={1,1,0,-1,-1,-1,0,1};
int dy[]={0,1,1,1,0,-1,-1,-1};
struct point{
int x,y;
};
void bfs(){
queue<pair<int,int> > q;
q.push(make_pair(sx,sy));
vis[sx][sy]=1;
while(!q.empty()){
pair<int,int> t=q.front();
q.pop();
int x=t.first,y=t.second;
if(mp[x][y]=='K') ++cnt;// **********************************
for(int i=0;i<8;i++){
int nx=x+dx[i],ny=y+dy[i];
// ****************************
if(nx<1||nx>n||ny<1||ny>n||vis[nx][ny]||h[nx][ny]>hmax||h[nx][ny]<hmin) continue;
vis[nx][ny]=1;
// ****************************
q.push(make_pair(nx,ny));
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>mp[i][j];
if(mp[i][j]=='K') ssk++;
if(mp[i][j]=='P') sx=i,sy=j;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>h[i][j];
// hmax=5,hmin=0;
// bfs();
// cout<<cnt;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(h[i][j]>=h[sx][sy]){
hmax=h[i][j];
int l=1,r=hmax;
while(l<=r){
int mid=l+r>>1;
hmin=mid;
memset(vis,0,sizeof(vis));
cnt=0;
bfs();
if(cnt==ssk){
ans=min(ans,hmax-hmin);
// cout<<l<<' '<<r<<endl;
l=mid+1;
}else r=mid-1;
}
}
cout<<ans;
return 0;
}
然后,我一顿乱搞,搞出 AC:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const ll Inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n,sx,sy;
char mp[55][55];
long long h[55][55];
long long ssk,cnt,ans=Inf,hmax,hmin,vis[55][55];
int dx[]={1,1,0,-1,-1,-1,0,1};
int dy[]={0,1,1,1,0,-1,-1,-1};
struct point{
int x,y;
};
void bfs(){
queue<pair<int,int> > q;
q.push(make_pair(sx,sy));
while(!q.empty()){
pair<int,int> t=q.front();
q.pop();
int x=t.first,y=t.second;
// **********************
if(x<1||x>n||y<1||y>n||vis[x][y]||h[x][y]>hmax||h[x][y]<hmin) continue;
vis[x][y]=1;
if(mp[x][y]=='K') ++cnt;
// **********************
for(int i=0;i<8;i++) q.push(make_pair(x+dx[i],y+dy[i]));
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>mp[i][j];
if(mp[i][j]=='K') ssk++;
if(mp[i][j]=='P') sx=i,sy=j;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>h[i][j];
// hmax=5,hmin=0;
// bfs();
// cout<<cnt;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(h[i][j]>=h[sx][sy]){
hmax=h[i][j];
int l=1,r=hmax;
while(l<=r){
int mid=l+r>>1;
hmin=mid;
memset(vis,0,sizeof(vis)),cnt=0;
bfs();
if(cnt==ssk){
ans=min(ans,hmax-hmin);
// cout<<l<<' '<<r<<endl;
l=mid+1;
}else r=mid-1;
}
}
cout<<ans;
return 0;
}
敢问有dalao知道,为什么打 * 处换了位置,就能过?
借此,也提示一下那些 WA 96,#9 不对的同学。