蒟蒻求助40分
查看原帖
蒟蒻求助40分
332022
ChthollyMeow楼主2020/5/2 13:04
#include<bits/stdc++.h>
#include<bits/extc++.h>
using namespace std;
struct node{
	int x,y,nvsb,tlprtn,s;
};
node node_min(node p,node q){
	if(p.s!=q.s){
		return p.s>q.s?q:p;
	}
	if(p.nvsb+p.tlprtn!=q.nvsb+q.tlprtn){
		return (p.nvsb+p.tlprtn)>(q.nvsb+q.tlprtn)?q:p;
	}
	else{
		return p.nvsb>q.nvsb?q:p;
	}
}
bool vis[355][355][20][20],sgt[355][35];
int chf[355][355];
int n,m,c1,c2,d,Sx,Sy,Tx,Ty;
int mp[355][355];
const int dx[]={1,0,-1,0,1,-1,-1,1};
const int dy[]={0,1,0,-1,1,1,-1,-1};
void look(int x,int y,int k){
	for(int i=0;i<k;i++){
		chf[max(x-i,1)][max(y-(k-i),1)]++;
		chf[max(x-i,1)][min(y+(k-i),m)+1]--;
		chf[min(x+i,n)][max(y-(k-i),1)]++;
		chf[min(x+i,n)][min(y+(k-i),m)+1]--;
	}
}
queue<node>que;
node ans=(node){0,0,77777777,88888888,99999999};
void BFS(){
	while(!que.empty()){
		node fnt=que.front();
		que.pop();
		if(fnt.s>ans.s){
			continue;
		}
		if(fnt.x==Tx&&fnt.y==Ty){
			ans=node_min(fnt,ans);
			continue;
		}
		for(int i=0;i<8;i++){
			int xx=fnt.x+dx[i];
			int yy=fnt.y+dy[i];
			if(xx<1||xx>n||yy<1||yy>m||mp[xx][yy]>0)continue;
			if(sgt[xx][yy]){
				if(vis[xx][yy][fnt.nvsb+1][fnt.tlprtn]||fnt.nvsb+1>c1)continue;
				vis[xx][yy][fnt.nvsb+1][fnt.tlprtn]=1;
				que.push((node){xx,yy,fnt.nvsb+1,fnt.tlprtn,fnt.s+1});
			}
			else{
				if(vis[xx][yy][fnt.nvsb][fnt.tlprtn])continue;
				vis[xx][yy][fnt.nvsb][fnt.tlprtn]=1;
				que.push((node){xx,yy,fnt.nvsb,fnt.tlprtn,fnt.s+1});
			}
		}
		if(fnt.tlprtn+1>c2)continue;
		for(int i=0;i<4;i++){
			int xx=fnt.x+dx[i]*d;
			int yy=fnt.y+dy[i]*d;
			if(xx<1||xx>n||yy<1||yy>m||mp[xx][yy]>0)continue;
			if(sgt[xx][yy]){
				if(vis[xx][yy][fnt.nvsb+1][fnt.tlprtn+1]||fnt.nvsb+1>c1)continue;
				vis[xx][yy][fnt.nvsb+1][fnt.tlprtn+1]=1;
				que.push((node){xx,yy,fnt.nvsb+1,fnt.tlprtn+1,fnt.s+1});
			}
			else{
				if(vis[xx][yy][fnt.nvsb][fnt.tlprtn+1])continue;
				vis[xx][yy][fnt.nvsb][fnt.tlprtn+1]=1;
				que.push((node){xx,yy,fnt.nvsb,fnt.tlprtn+1,fnt.s+1});
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>c1>>c2>>d;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			string s;
			cin>>s;
			switch(s[0]){
				case 'S':{
					Sx=i;
					Sy=j;
					mp[i][j]=-1;
					que.push((node){Sx,Sy,0,0,0});
					vis[i][j][0][0]=1;
					break;
				}
				case 'T':{
					Tx=i;
					Ty=j;
					mp[i][j]=-2;
					break;
				}
				case '.':{
					mp[i][j]=0;
					break;
				}
				default:{
					int sgtt=0;
					for(int i=0;i<s.size();i++){
						sgtt=(sgtt<<1)+(sgtt<<3)+(s[i]^'0');
					}
					mp[i][j]=sgtt;
					look(i,j,sgtt);
					break;
				}
			}
		}
	}
	for(int i=1;i<=n;i++){
		int sum=0;
		for(int j=1;j<=m;j++){
			sum+=chf[i][j];
			if(sum>0){
				sgt[i][j]=1;
			}
		}
	}
	BFS();
	if(ans.s==99999999)cout<<-1<<endl;
	else cout<<ans.s<<" "<<ans.nvsb<<" "<<ans.tlprtn<<endl;
	return 0;
}

#1,#4,#6,#8,#11,#13,#19,#20:AC

其余均WA......

评测记录

咋都看不出来错误,求大佬帮助/kel

2020/5/2 13:04
加载中...