本人妹子 刚学OI 不到40行代码WA求调
查看原帖
本人妹子 刚学OI 不到40行代码WA求调
227728
冰糖鸽子TJ鸽子协会楼主2021/6/18 21:36

RT,WA的 5~11 和 13,思路就和题解一样。

样例倒是都过了。

#include <bits/stdc++.h>
using namespace std;
#define M 35
#define N 5
#define EP Enu_Pre_Ret
#define int long long
const int mod=1e9+9;
int n,m,ans,c1,c2,cans;
char c[M][M];
int dir[5][N],f[M][M][M][M],g[N][N][N][N];
bool Ck(int x,int fw) {return (x<1||x>fw);}
int Sol(int u1,int p1,int u2,int p2)
{
	int res=1; if(f[u1][p1][u2][p2]!=-1) return f[u1][p1][u2][p2];
	if(Ck(u1,n)+Ck(u2,n)+Ck(p1,m)+Ck(p2,m)+(c[u1][p1]!=c[u2][p2])) return 0;
	for(int i=1;i<=c1;i++) for(int j=1;j<=c2;j++) res+=Sol(u1+dir[0][i],p1+dir[1][i],u2+dir[2][j],p2+dir[3][j]);
	f[u1][p1][u2][p2]=res; return res;
}
int Enu_Pre_Ret(int d1,int d2,int d3,int d4)
{
	if(-1!=g[d1+2][d2+2][d3+2][d4+2]) return g[d1+2][d2+2][d3+2][d4+2];
	c1=c2=cans=0;
	for(int i=-1;i<2;i++) if(!i||i==d1) for(int j=-1;j<2;j++) if(!(i==0&&j==0)&&(!j||j==d2)) dir[0][++c1]=i,dir[1][c1]=j;
	for(int i=-1;i<2;i++) if(!i||i==d3) for(int j=-1;j<2;j++) if(!(i==0&&j==0)&&(!j||j==d4)) dir[2][++c2]=i,dir[3][c2]=j;  memset(f,-1,sizeof(f));
	for(int _u=1;_u<=n;_u++) for(int _p=1;_p<=m;_p++) for(int U=1;U<=n;U++) for(int P=1;P<=m;P++) cans+=Sol(_u,_p,U,P);  cans%=mod;
	g[d1+2][d2+2][d3+2][d4+2]=g[d3+2][d4+2][d1+2][d2+2]=g[-d1+2][-d2+2][-d3+2][-d4+2]=g[-d3+2][-d4+2][-d1+2][-d2+2]=cans;
	return cans;
}
int Get(int d1,int d2) {return (((EP(d1,d2,1,-1)+EP(d1,d2,1,1)+EP(d1,d2,-1,-1)+EP(d1,d2,-1,1))%mod)-(EP(d1,d2,1,0)+EP(d1,d2,-1,0)+EP(d1,d2,0,1)+EP(d1,d2,0,-1))+mod*N)%mod;}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>c[i][j]; memset(g,-1,sizeof(g));
	ans=Get(1,-1)+Get(1,1)+Get(-1,-1)+Get(-1,1),ans-=Get(1,0)+Get(-1,0)+Get(0,1)+Get(0,-1),ans+=mod*N,ans%=mod;
	cout<<ans<<endl;
	return 0;
}
2021/6/18 21:36
加载中...