出题人求hack
查看原帖
出题人求hack
389192
andychen_2012楼主2022/12/19 09:36

欢迎来hack掉下面这份错误的代码呀。

#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
inline int read(){
	int x=0;
	int ch=getchar(),f=0;
	while(ch<48||ch>57) f=(ch=='-'),ch=getchar();
	while(ch>47&&ch<58) x=(x<<3)+(x<<1)+(ch&15),ch=getchar();
	return f?-x:x;
}
inline void write(int x,char end='\n'){
	if(x==0){
		putchar('0');
		putchar(end);
		return;
	}
	if(x<0) putchar('-'),x=-x;
	int st[70],sr=0;
	while(x){
		st[sr++]=x%10;
		x/=10;
	}
	while(sr--) putchar(st[sr]+48);
	putchar(end);
	return;
}
const int N=2005,INF=2e9;
const int M=2500005,M2=5000005;
const int dx[4]={0,1,-1,0},dy[4]={1,0,0,-1};
int n;
char s[N][N];
int dis[N];
int col[N][N];
int head,tail;
struct node{
    int x,y;
};
struct edge{
	int to,nxt;
}e[M2];
int hd[M2],ecnt;
inline void add(int u,int v){
	e[++ecnt].to=v;
	e[ecnt].nxt=hd[u];
	hd[u]=ecnt;
}
node q[M2];
int cango[10],only[M2][2];
#define mp make_pair
map<pair<int,int>,bool> mps;
inline void bfs(){
	int cnt=0;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j){
			if(s[i][j]=='.'&&!col[i][j]){
				head=1,tail=0;
				++cnt;
				q[++tail]=(node{i,j});
				while(head<=tail){
					node h=q[head++];
					int x=h.x,y=h.y;
					col[x][y]=cnt;
					for(int i=0;i<4;++i){
						int tx=x+dx[i],ty=y+dy[i];
						if(s[tx][ty]!='.') continue;
						if(!col[tx][ty]){
							col[tx][ty]=cnt;
							q[++tail]=(node{tx,ty});
						}
					}
				}
			}
		}
	}
	for(int i=1;i<=cnt;++i) only[i][0]=only[i][1]=-1;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=n;++j){
			if(col[i][j]){
				int g=col[i][j];
				if(s[i-1][j]=='#'){
					if(only[g][0]==-1){
						only[g][0]=i-1;
						only[g][1]=j;
					}
					else
						only[g][0]=only[g][1]=-2;
				}
				if(s[i+1][j]=='#'){
					if(only[g][0]==-1){
						only[g][0]=i+1;
						only[g][1]=j;
					}
					else
						only[g][0]=only[g][1]=-2;
				}
				if(s[i][j-1]=='#'){
					if(only[g][0]==-1){
						only[g][0]=i;
						only[g][1]=j-1;
					}
					else
						only[g][0]=only[g][1]=-2;
				}
				if(s[i][j+1]=='#'){
					if(only[g][0]==-1){
						only[g][0]=i;
						only[g][1]=j+1;
					}
					else
						only[g][0]=only[g][1]=-2;
				}
			}
		}
	}
	for(int i=0;i<=n+1;++i){
		for(int j=0;j<=n+1;++j){
			if(s[i][j]=='#'){
//				printf("now judging:%d %d\n",i,j);
				for(int k=1;k<=4;++k) cango[k]=-1;
				if(i<n&&col[i+1][j]) cango[1]=col[i+1][j];
				if(i>1&&col[i-1][j]) cango[2]=col[i-1][j];
				if(j<n&&col[i][j+1]) cango[3]=col[i][j+1];
				if(j>1&&col[i][j-1]) cango[4]=col[i][j-1];
				for(int k=j-1;k>=1&&s[i][k]!='#';--k){
					int c=col[i][k];
					if(c){
						for(int l=1;l<=4;++l){
							if(cango[l]==-1) continue;
							if(c==cango[l]) continue;
							if(mps[mp(c,cango[l])]&&mps[mp(cango[l],c)]) continue;
							if(only[c][0]==-1) continue;
							if(k==j-1){
								if(only[cango[l]][0]==-2){
									if(!mps[mp(cango[l],c)]){
										mps[mp(cango[l],c)]=1;
										add(cango[l],c);
									}
								}
								continue;
							}
							if(mps[mp(c,cango[l])]) continue;
							mps[mp(c,cango[l])]=1;
							add(c,cango[l]);
//							printf("%d %d\n",c,cango[l]);
						}
					}
				}
				for(int k=j+1;k<=n&&s[i][k]!='#';++k){
					int c=col[i][k];
					if(c){
						for(int l=1;l<=4;++l){
							if(cango[l]==-1) continue;
							if(c==cango[l]) continue;
							if(mps[mp(c,cango[l])]&&mps[mp(cango[l],c)]) continue;
							if(only[c][0]==-1) continue;
							if(k==j+1){
								if(only[cango[l]][0]==-2){
									if(!mps[mp(cango[l],c)]){
										mps[mp(cango[l],c)]=1;
										add(cango[l],c);
									}
								}
								continue;
							}
							if(mps[mp(c,cango[l])]) continue;
							mps[mp(c,cango[l])]=1;
							add(c,cango[l]);
						}
					}
				}
				for(int k=i-1;k>=1&&s[k][j]!='#';--k){
					int c=col[k][j];
					if(c){
						for(int l=1;l<=4;++l){
							if(cango[l]==-1) continue;
							if(c==cango[l]) continue;
							if(mps[mp(c,cango[l])]&&mps[mp(cango[l],c)]) continue;
							if(only[c][0]==-1) continue;
							if(k==i-1){
								if(only[cango[l]][0]==-2){
									if(!mps[mp(cango[l],c)]){
										mps[mp(cango[l],c)]=1;
										add(cango[l],c);
									}
								}
								continue;
							}
							if(mps[mp(c,cango[l])]) continue;
							mps[mp(c,cango[l])]=1;
							add(c,cango[l]);
						}
					}
				}
				for(int k=i+1;k<=n&&s[k][j]!='#';++k){
					int c=col[k][j];
					if(c){
						for(int l=1;l<=4;++l){
							if(cango[l]==-1) continue;
							if(c==cango[l]) continue;
							if(mps[mp(c,cango[l])]&&mps[mp(cango[l],c)]) continue;
							if(only[c][0]==-1) continue;
							if(k==i+1){
								if(only[cango[l]][0]==-2){
									if(!mps[mp(cango[l],c)]){
										mps[mp(cango[l],c)]=1;
										add(cango[l],c);
									}
								}
								continue;
							}
							if(mps[mp(c,cango[l])]) continue;
							mps[mp(c,cango[l])]=1;
							add(c,cango[l]);
						}
					}
				}
			}
		}
	}
	dis[1]=0;
	for(int i=2;i<=cnt;++i) dis[i]=INF;
	priority_queue<pair<int,int> > q2;
	q2.push(mp(0,1));
	while(!q2.empty()){
		int u=q2.top().second;
		q2.pop();
		for(int i=hd[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(dis[v]>dis[u]+1){
				dis[v]=dis[u]+1;
				q2.push(mp(-dis[v],v));
			}
		}
	}
	mps.clear();
	for(int i=1;i<=ecnt;++i) e[i]=edge{0,0};
	ecnt=0;
	for(int i=1;i<=cnt;++i) hd[i]=0;
	cnt=0;
}
int main(){
	freopen("portal.in","r",stdin);
	freopen("std2.out","w",stdout);
    int T=read();
    while(T--){
    	n=read();
        for(int i=1;i<=n;i++)
            scanf("%s",s[i]+1);
        if(s[1][1]!='.'||s[n][n]!='.')
            return 0;
        for(int i=0;i<=n+1;++i)
        	for(int j=0;j<=n+1;++j)
        		col[i][j]=0;
        for(int i=0;i<=n+1;++i) s[i][0]=s[i][n+1]='#';
        for(int i=0;i<=n+1;++i) s[0][i]=s[n+1][i]='#';
		bfs();
        if(dis[col[n][n]]==INF) puts("-1");
        else printf("%d\n",dis[col[n][n]]*2);
    }
    return 0;
}
2022/12/19 09:36
加载中...