萌新求助orz
查看原帖
萌新求助orz
307090
study_nerd楼主2020/5/31 22:18

RT,这题我调了几个小时了,可是第二十六个测试点总是过不去,求大佬帮忙改正

#include<bits/stdc++.h>
using namespace std;
long long n,m,k,ans=1,sum=0,sum2=1,dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
bool flag=true,a[1005][1005]={false};
char b[1005][1005];
void dfs(int x,int y)
{
	int num=0;
	for(int i=0;i<=3;i++)
	{
		int nx=x+dx[i],ny=y+dy[i];
		if(nx<=n&&nx>=1&&ny<=m&&ny>=1&&b[nx][ny]=='O')num++;
	}
	if(num==1)sum++;
	if(num>=3)
	{
		flag=false;
	}
	for(int i=0;i<=3;i++)
	{
		int nx=x+dx[i],ny=y+dy[i];
		if(nx<=n&&nx>=1&&ny<=m&&ny>=1&&b[nx][ny]=='O'&&a[nx][ny]==false)
		{
			sum2++;
			a[nx][ny]=true;
			dfs(nx,ny);
		}
	}
	return;
}
int main()
{
	cin>>n>>m>>k;
	k=k%998244353;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>b[i][j];
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(a[i][j]==false&&b[i][j]=='O')
			{
				sum=0;
				sum2=1;
				flag=true;
				a[i][j]=true;
				int num=0;
				for(int l=0;l<=3;l++)
				{
					int nx=dx[l]+i,ny=dy[l]+j;
					if(nx<=n&&nx>=1&&ny<=m&&ny>=1&&b[nx][ny]=='O')num++;
				}
				if(num==0)ans=ans*k%998244353;
				else if(num<3)
				{
					dfs(i,j);
					if(flag==true&&sum==2)
					{
						long long s=k;
						for(int i=1;i<sum2;i++)
						{
							s*=(k-1);
							s%=998244353;
						}
						ans=ans*s%998244353;
					}
				}
			}
		}
	}
	if(k%998244353==0||k%998244353==1)cout<<0;
	else if(ans==1)cout<<0;
	else cout<<ans;
	return 0;
}
2020/5/31 22:18
加载中...