测试点7和10WA了一上午了,求调
查看原帖
测试点7和10WA了一上午了,求调
291509
Cupricion楼主2023/8/8 11:22

测试信息:https://www.luogu.com.cn/record/119622106

#include<bits/stdc++.h>
using namespace std;
char a[60][60];
bool st[60][60];
int emy[60][60];
int q[3600][3],h=0,t=-1,n,stx,sty,qe[3600][60][60];
int dy[8]={-1,1,2,2,1,-1,-2,-2};
int dx[8]={-2,-2,-1,1,2,2,1,-1};
void C(int x,int y,bool lod)
{
	if(lod)
	{
		for(int i=y-1;i>0;i--)
		{
			emy[x][i]++;
			if(a[x][i]!='.')
				break;
		}
		for(int i=y+1;i<=n;i++)
		{
			emy[x][i]++;
			if(a[x][i]!='.')
				break;
		}
		for(int i=x-1;i>0;i--)
		{
			emy[i][y]++;
			if(a[i][y]!='.')
				break;
		}
		for(int i=x+1;i<=n;i++)
		{
			emy[i][y]++;
			if(a[i][y]!='.')
				break;
		}
	}
}
void K(int x,int y,bool lod)
{
	if(lod)
	{
		for(int i=0;i<8;i++)
		{
			int xx=x+dx[i],yy=y+dy[i];
			if(xx<1||xx>n||yy<1||yy>n)
				continue;
			emy[xx][yy]++;
		}
	}
}
void B(int x,int y,bool lod)
{
	if(lod)
	{
		int j=y-1;
		for(int i=x-1;i>0&&j>0;i--)
		{
			emy[i][j]++;
			if(a[i][j]!='.')
				break;
			j--;
		}
		j=y-1;
		for(int i=x+1;i<=n&&j>0;i++)
		{
			emy[i][j]++;
			if(a[i][j]!='.')
				break;
			j--;
		}
		j=y+1;
		for(int i=x-1;i>0&&j<=n;i--)
		{
			emy[i][j]++;
			if(a[i][j]!='.')
				break;
			j++;
		}
		j=y+1;
		for(int i=x+1;i<=n&&j<=n;i++)
		{
			emy[i][j]++;
			if(a[i][j]!='.')
				break;
			j++;
		}
	}
}
void X(int x,int y)
{
	int kx[8]={-1,0,1,1,1,0,-1,-1};
	int ky[8]={-1,-1,-1,0,1,1,1,0};
	for(int i=0;i<8;i++)
	{
		int xx=x+kx[i],yy=y+ky[i];
		if(xx<1||xx>n||yy<1||yy>n)
			continue;
		emy[xx][yy]++;
	}
}
int bfs(int fx,int fy)
{
	q[0][0]=fx;
	q[0][1]=fy;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			qe[0][i][j]=emy[i][j];	
	}
	q[++t][2]=0;
	st[fx][fy]=true;
	while(h<=t)
	{
		int x=q[h][0],y=q[h][1],s=q[h][2],nowem[60][60];
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
				nowem[i][j]=qe[h][i][j];	
		}
		for(int k=0;k<8;k++)
		{
			int xx=x+dx[k],yy=y+dy[k],nm[60][60];
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=n;j++)
					nm[i][j]=nowem[i][j];	
			}
			if(a[xx][yy]=='X')
				return s+1;
			if(xx<1||xx>n||yy<1||yy>n)
				continue;
			if(emy[xx][yy])
				continue;  
			if(st[xx][yy])
				continue;
			if(a[xx][yy]=='C')
			{
				for(int i=yy-1;i>0;i--)
				{
					nm[xx][i]--;
					if(a[xx][i]!='.')
						break;
				}
				for(int i=yy+1;i<=n;i++)
				{
					nm[xx][i]--;
					if(a[xx][i]!='.')
						break;
				}
				for(int i=xx-1;i>0;i--)
				{
					nm[i][yy]--;
					if(a[i][yy]!='.')
						break;
				}
				for(int i=xx+1;i<=n;i++)
				{
					nm[i][yy]--;
					if(a[i][yy]!='.')
						break;
				}
			}
			else if(a[xx][yy]=='K')
			{
				for(int i=0;i<8;i++)
				{
					int xxx=xx+dx[i],yyy=yy+dy[i];
					if(xxx<1||xxx>n||yyy<1||yyy>n)
						continue;
					nm[xxx][yyy]--;
				}
			}
			else if(a[xx][yy]=='B')
			{
				int j=yy-1;
				for(int i=xx-1;i>0&&j>0;i--)
				{
					nm[i][j]--;
					if(a[i][j]!='.')
						break;
					j--;
				}
				j=yy-1;
				for(int i=xx+1;i<=n&&j>0;i++)
				{
					nm[i][j]--;
					if(a[i][j]!='.')
						break;
					j--;
				}
				j=yy+1;
				for(int i=xx-1;i>0&&j<=n;i--)
				{
					nm[i][j]--;
					if(a[i][j]!='.')
						break;
					j++;
				}
				j=yy+1;
				for(int i=xx+1;i<=n&&j<=n;i++)
				{
					nm[i][j]--;
					if(a[i][j]!='.')
						break;
					j++;
				}
			}
			else if(a[xx][yy]=='Q')
			{
				for(int i=yy-1;i>0;i--)
				{
					nm[xx][i]--;
					if(a[xx][i]!='.')
						break;
				}
				for(int i=yy+1;i<=n;i++)
				{
					nm[xx][i]--;
					if(a[xx][i]!='.')
						break;
				}
				for(int i=xx-1;i>0;i--)
				{
					nm[i][yy]--;
					if(a[i][yy]!='.')
						break;
				}
				for(int i=xx+1;i<=n;i++)
				{
					nm[i][yy]--;
					if(a[i][yy]!='.')
						break;
				}
				int j=yy-1;
				for(int i=xx-1;i>0&&j>0;i--)
				{
					nm[i][j]--;
					if(a[i][j]!='.')
						break;
					j--;
				}
				j=yy-1;
				for(int i=xx+1;i<=n&&j>0;i++)
				{
					nm[i][j]--;
					if(a[i][j]!='.')
						break;
					j--;
				}
				j=yy+1;
				for(int i=xx-1;i>0&&j<=n;i--)
				{
					nm[i][j]--;
					if(a[i][j]!='.')
						break;
					j++;
				}
				j=yy+1;
				for(int i=xx+1;i<=n&&j<=n;i++)
				{
					nm[i][j]--;
					if(a[i][j]!='.')
						break;
					j++;
				}
			}
			else if(a[xx][yy]=='P')
			{
				nm[xx+1][yy-1]--;
				nm[xx+1][yy+1]--;
			}
			q[++t][0]=xx;
			q[t][1]=yy;
			q[t][2]=s+1;
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=n;j++)
					qe[t][i][j]=nm[i][j];
			}
			st[xx][yy]=true;
		}
		++h;
	}
	return -1;
}
int main()
{
	//freopen("myans.in","r",stdin);
	//freopen("myans.out","w",stdout);
	while(scanf("%d",&n)!=EOF)
	{
		memset(emy,0,sizeof emy);
		memset(st,false,sizeof st);
		h=0;
		t=-1;
		getchar();
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				scanf("%c",&a[i][j]);
			}
			getchar();
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(a[i][j]=='O')
				{
					stx=i;
					sty=j;
					st[i][j]=true;
				}
				else if(a[i][j]=='C')
				{
					C(i,j,true);
				}
				else if(a[i][j]=='K')
				{
					K(i,j,true);
				}
				else if(a[i][j]=='B')
				{
					B(i,j,true);
				}
				else if(a[i][j]=='Q')
				{
					C(i,j,true);
					B(i,j,true);
				} 
				else if(a[i][j]=='X')
				{
					X(i,j);
				}
				else if(a[i][j]=='P')
				{
					emy[i+1][j-1]++;
					emy[i+1][j+1]++;
				}
			}
		}
		
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
				cout<<emy[i][j];
			cout<<endl;
		}
		
		printf("%d\n",bfs(stx,sty));
	}
	return 0;
}
/*
6
O.....
......
...B..
......
......
...X..
*/
2023/8/8 11:22
加载中...