这道题我一开始写得是用 dfs 搜索出所有的情况,对于最小和次小的编号 A,B 进行记忆化,然后判断三种情况:
A 活,B 死。
A 死,B 活。
A 死,B 死。
然后继续进行搜索。
inline void dfs(int turn,int a,int b)
{
if(turn<0) return;
if(vis[a][b]) return;
vis[a][b]=true;
// printf("count:%d %d\n",a,b);
if(a>n||b>n)
{
++ans;
return;
}
++ans;
if(turn<0) return;
bool ld=false;
bool dl=false;
bool dd=false;
bool p0(flag[b][0]),p1(flag[b][1]),pp(flag[b][2]);
if((p1==0)&&(p[a]!=0)) ld=true;
if((p1||pp)&&(p[a]!=100)) dl=true;
if((p1||pp)&&(p[a]!=0)) dd=true;
if(ld)
{
dfs(turn-1,a,b+1);
}
if(dd)
{
dfs(turn-1,b+1,b+2);
}
if(dl)
{
dfs(turn-1,b,b+1);
}
return;
}
但是我 WA on 7。
在一遍一遍的尝试之后我碰巧 AC 了本题,我对比了两次的代码发现唯一的变化就是,交换了两个判断的顺序,也就是先判断 dd,再判断 ld:
inline void dfs(int turn,int a,int b)
{
if(turn<0) return;
if(vis[a][b]) return;
vis[a][b]=true;
// printf("count:%d %d\n",a,b);
if(a>n||b>n)
{
++ans;
return;
}
++ans;
if(turn<0) return;
bool ld=false;
bool dl=false;
bool dd=false;
bool p0(flag[b][0]),p1(flag[b][1]),pp(flag[b][2]);
if((p1==0)&&(p[a]!=0)) ld=true;
if((p1||pp)&&(p[a]!=100)) dl=true;
if((p1||pp)&&(p[a]!=0)) dd=true;
if(dd)
{
dfs(turn-1,b+1,b+2);
}
if(ld)
{
dfs(turn-1,a,b+1);
}
if(dl)
{
dfs(turn-1,b,b+1);
}
return;
}
这样就 AC 了。
求问这是为什么。