RT,我的两份错误代码能过(
第一份:
#include<cstdio>
const int ntf=998244353;
int n,m,k,ans=1;
char s[1007][1007];
int vis[1007][1007];
int dir[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
int dfs(int x,int y,int d)
{
int f=0,r,c,t=0;
vis[x][y]=1;
for(int i=0;i<4;++i)
{
if(i==(d^2))continue;
r=x+dir[i][0],c=y+dir[i][1];
if(r<0||r==n||c<0||c==m)continue;
if(s[r][c]=='X')continue;
if(vis[r][c])return 0;
if(f)return 0;
t=dfs(r,c,i);
if(!t)return 0;
}
return t+1;
}
inline int qpw(int x,int v)
{
int r=1;
while(v)
{
(v&1)&&(r=1ll*r*x%ntf);
x=1ll*x*x%ntf;
v>>=1;
}
return r;
}
int main()
{
scanf(" %d %d %d",&n,&m,&k);
for(int i=0;i<n;++i)scanf(" %s",s[i]);
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
{
if(s[i][j]=='X'||vis[i][j])continue;
int q=dfs(i,j,4);
if(q==0)
{
printf("0\n");
return 0;
}
ans=1ll*ans*qpw(k-1,q-1)%ntf*k%ntf;
}
}
printf("%d\n",ans);
return 0;
}
没能有效判断一个座位有超过两个相邻座位的情况,在下面这组数据上是错的
Input:
2 3 3
XOX
OOO
Output:
12
Correct Output:
0
改掉这点后,第二份错误代码:
#include<cstdio>
const int ntf=998244353;
int n,m,k,ans=1;
char s[1007][1007];
int vis[1007][1007];
int dir[4][2]={{0,-1},{-1,0},{0,1},{1,0}};
int dfs(int x,int y,int d)
{
int f=0,r,c,t=0;
vis[x][y]=1;
for(int i=0;i<4;++i)
{
if(i==(d^2))continue;
r=x+dir[i][0],c=y+dir[i][1];
if(r<0||r==n||c<0||c==m)continue;
if(s[r][c]=='X')continue;
if(vis[r][c])return 0;
if(f)return 0;
t=dfs(r,c,i);f=1;
if(!t)return 0;
}
return t+1;
}
inline int qpw(int x,int v)
{
int r=1;
while(v)
{
(v&1)&&(r=1ll*r*x%ntf);
x=1ll*x*x%ntf;
v>>=1;
}
return r;
}
int main()
{
scanf(" %d %d %d",&n,&m,&k);
for(int i=0;i<n;++i)scanf(" %s",s[i]);
for(int i=0;i<n;++i)
{
for(int j=0;j<m;++j)
{
if(s[i][j]=='X'||vis[i][j])continue;
int q=dfs(i,j,4);
if(q==0)
{
printf("0\n");
return 0;
}
ans=1ll*ans*qpw(k-1,q-1)%ntf*k%ntf;
}
}
printf("%d\n",ans);
return 0;
}
没有从端点开始 dfs,会在下面这组数据出错:
Input:
2 2 3
OO
OX
Output:
0
Correct Output:
12