为什么T??
查看原帖
为什么T??
772999
jr_zch楼主2023/5/19 16:26

比题解跑得快很多,在第16个点T

#include <bits/stdc++.h>
#define pair pair<int,int>
using namespace std;
 
const int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1};
const int maxn=3e2+7,maxt=23,maxs=(1<<19)+7;
int n,m,t,cnt,sr,g,ans=-maxt;
int mp[maxn][maxn],dis[maxt][maxt],f[maxs][maxt];
bool vis[maxn][maxn];
char s[maxn][maxn];
struct node{
	int x,y,len;
};
pair to[maxt];
queue<node> q;
 
void init(){
	memset(mp,-1,sizeof(mp));
	memset(dis,0x3f,sizeof(dis));
	memset(f,0x3f,sizeof(f));
	return ;
}
 
void bfs(int st){
	while(q.size()) q.pop();
	memset(vis,0,sizeof(vis));
	q.push({to[st].first,to[st].second,0});
	vis[to[st].first][to[st].second]=1;
	while(q.size()){
		int ux=q.front().x,uy=q.front().y,ulen=q.front().len;
		vis[ux][uy]=1,q.pop();
		if(s[ux][uy]=='S'||s[ux][uy]=='G'||s[ux][uy]=='o') dis[st][mp[ux][uy]]=ulen;
		for(int i=1;i<=4;i++){
			int vx=ux+dx[i],vy=uy+dy[i];
			if(vis[vx][vy]||vx<1||vx>n||vy<1||vy>m||s[vx][vy]=='#'||ulen+1>t) continue;
			q.push({vx,vy,ulen+1});
		}
	}
	return ;
}
 
int main(){
	init();
	scanf("%d%d%d",&n,&m,&t);
	for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++) if(s[i][j]=='o') mp[i][j]=cnt,to[cnt++]={i,j};
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(s[i][j]=='S') sr=cnt,mp[i][j]=sr,to[sr]={i,j};
			if(s[i][j]=='G') g=sr+1,mp[i][j]=g,to[g]={i,j};
		}
	}
	for(int i=0;i<=cnt+1;i++) bfs(i);
	if(dis[sr][g]>t) printf("-1"),exit(0);
	for(int i=0;i<cnt;i++) f[1<<i][i]=dis[sr][i];
	for(int s=0;s<1<<cnt;s++){
		for(int i=0;i<cnt;i++){
			if(!(s>>i&1)) continue;
			for(int j=0;j<cnt;j++){
				if(!(s>>j&1)||i==j) continue;
				f[s][j]=min(f[s][j],f[s^1<<j][i]+dis[i][j]);
			}
		}
	}
	for(int s=0;s<1<<cnt;s++){
		for(int i=0;i<cnt;i++){
			if(!(s>>i&1)||f[s][i]+dis[i][g]>t) continue;
			ans=max(ans,__builtin_popcount(s));
		}
	}
	printf("%d",ans);
	return 0;
}
2023/5/19 16:26
加载中...