一件有点神奇的事,希望dalao回答
查看原帖
一件有点神奇的事,希望dalao回答
946233
ChuYilin2011楼主2024/7/4 20:54

第一次交,我 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 不对的同学。

2024/7/4 20:54
加载中...