原题题面:https://ac.nowcoder.com/acm/contest/33191/M
分析:
因为
(
x
,
y
)
(x,y)
(x,y)的状态是从
(
x
+
1
,
y
)
(x+1,y)
(x+1,y),
(
x
,
y
+
1
)
(x,y+1)
(x,y+1)得到的,故可以定义
d
p
i
,
j
dp_{i,j}
dpi,j为在
(
i
,
j
)
(i,j)
(i,j)位置时Alice,Bob是否有赢或平局的状态,
可用1表示Alice赢了
用2表示平局
用4表示Alice输了
用二进制上的值是否为1表示是否有这种状态
状态转移方程:
若Alice操作 即(x+y)%2
=
=
0
==0
==0 则
(
x
+
1
,
y
)
,
(
x
,
y
+
1
)
(x+1,y),(x,y+1)
(x+1,y),(x,y+1)中有一个为’A’便赢了
若Bob操作 那么只有
(
x
+
1
,
y
)
,
(
x
,
y
+
1
)
(x+1,y),(x,y+1)
(x+1,y),(x,y+1)都为"A"才可
即当(x+y)%2
=
=
0
==0
==0
d
p
i
,
j
=
d
p
i
+
1
,
j
∣
d
p
i
,
j
+
1
dp_{i,j}=dp_{i+1,j} | dp_{i,j+1}
dpi,j=dpi+1,j∣dpi,j+1
否则
d
p
i
,
j
=
d
p
i
+
1
,
j
dp_{i,j}=dp_{i+1,j}
dpi,j=dpi+1,j &
d
p
i
,
j
+
1
dp_{i,j+1}
dpi,j+1
搜索时可以采用记忆化搜索
代码:
#include<bits/stdc++.h>
using namespace std;
const int MXN=503;
char a[MXN][MXN];
int n,m;
int dp[MXN][MXN];
// Alice win 1;
// Bob win 4
int dfs(int x,int y){
if(dp[x][y]>0) return dp[x][y];
if(a[x][y]=='A') return 1;
if(a[x][y]=='B') return 4;
if(x==n && y==m) return 2;
if(x==n) return dp[x][y]=dfs(x,y+1);
else if(y==m) return dp[x][y]=dfs(x+1,y);
else {
if((x+y)%2==0) return dp[x][y]=dfs(x+1,y)|dfs(x,y+1);
else return dp[x][y]=dfs(x,y+1)&dfs(x+1,y);
}
}
int main(){
int t,res;
scanf("%d",&t);
while(t--){
memset(dp,0,sizeof(dp));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",a[i]+1);
}
res=dfs(1,1);
if(res&1) printf("yes ");
else printf("no ");
if(res&2) printf("yes ");
else printf("no ");
if(res&4) printf("yes\n");
else printf("no\n");
}
}