这里应用了分而治之(divide and conquer)的思想:
递归函数bool CanYield(c1,c2,t)
if(t= =1 && ( c1= =c2 || c1→c2只需一步)) return true;if(t>1)
{ for(每个格局cm)
{ bool r1=CanYield(c1,cm,ceil(t/2));
bool r2=CanYield(cm,c2,ceil(t/2));
if(r1 && r2) return true;
}
}
return false;
分析分析
递归深度log2t,t是步数,所以就是所有分支上的最大可能时间t=2O(f(n)), log2t=O(f(n))
每递归一层,需要补充O(f(n))的空间
因此最大空间: O(f(n)) ×log2t=O(f2(n))。
注意这里的几个问题,首先是 for(每个格局cm)这里每次用的是一个cm时这里注意当返回时空间可以复用 。
其次 这里关于f(n)的问题,可以通过试探进行解决