疑惑!!!!!!!!!
查看原帖
疑惑!!!!!!!!!
360511
UperFicial楼主2023/6/28 21:49

这道题我一开始写得是用 dfs 搜索出所有的情况,对于最小和次小的编号 A,BA,B 进行记忆化,然后判断三种情况:

  • AA 活,BB 死。

  • AA 死,BB 活。

  • AA 死,BB 死。

然后继续进行搜索。

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 了。

求问这是为什么。

2023/6/28 21:49
加载中...