6分求调(样例全过)
查看原帖
6分求调(样例全过)
1146960
abc1783150878楼主2023/11/13 19:12
#include<iostream>
#include<cstdio>
#define F(i,j,k) for(int i=(j);i<=(k);i++)
#define N 1002
#define P 998244353
using namespace std;
int n,m,T,id,a1;
bool map[N][N];//思路:若第y1到第y2有通路,结果为x1可延长的数量加x2可延长的数量
int mapk[N][N];
bool c,f;
int ans;
void doc();
void dof();
int main(){
	cin>>T>>id;
	int k,tmp,tmp2;
	while(T--){
		cin>>n>>m>>c>>f;getchar();
		F(i,1,n){
			F(j,1,m)
			{
				map[i][j]=getchar()=='0'?false:true;
			}
			getchar();
		}
		F(i,1,n)
		F(j,1,m-1){
			if(map[i][j])continue;
			/*if(!map[i][j]){
				tmp=i;
				while(map[tmp][j]==0){
					tmp++;
				}
			}
			k=tmp-i;
			if(tmp==1)continue;*/
			tmp2=j;
			F(h,1,m-j+1)//边界:m-j+1
			{
				if(map[i][tmp2])break;
				else tmp2++;
			}
				a1=tmp2-j>0?tmp2-j-1:0;
				mapk[i][j]=a1;
		}
		doc();
		cout<<' ';
		dof();
		cout<<endl;
	}
	return 0;
}
void doc(){
	int tt,p,anstmp;
	ans=0;
	F(i,1,n-2)
		F(j,1,m-1)
		{
			anstmp=0;
			if(mapk[i][j]){
				tt=mapk[i][j],p=i+1;
				if(map[p][j])p=n+100;//跳出循环 
				while(p<n){
					p++;
					if(!map[p][j])anstmp+=mapk[p][j];
					else break;
				}
			}
			ans+=(anstmp*tt)%P;
			ans%=P;
			
		}
	cout<<ans*c;
}
void dof(){
	int tt,p,anstmp;
	ans=0;
	F(i,1,n-3)
		F(j,1,m-1)
		{
			anstmp=0;
			if(mapk[i][j]){
				tt=mapk[i][j],p=i;
				while(!map[p+1][j]&&p<n){
					p++;
				}//[i,p]
				if(i+2<p){
					F(h,i+2,p-1){
						anstmp+=mapk[h][j]*(p-i-2);
					} 
				}
			}
			ans+=(anstmp*tt)%P;
			ans%=P;
			
		}
	cout<<ans*f;
}
2023/11/13 19:12
加载中...