参考:http://blog.youkuaiyun.com/qq_32183461/article/details/50705953
一般题目下来,感觉到穷举的味道,便可以想想是否可以深度优先。
1.一般题目下来,先思考以什么为结点,以什么样的逻辑顺序。
2.一般题目最初的思路都是基于以下这样的模型。然后再通过慢慢的剪枝.条件判断中途break,等优化,具体因题而异,然后渐渐的与该模型不相似。这样的模型其实是递归到最深时才进行判断,一般我们进行优化的后可以边递归边判断,即把判断写在了dfs里面,用条件语句判断,如果进入到里边判断不符合后要break.或者某些 取值集合的元素个数 与 深度不同的题目,由深到浅搜索,只要符合既可以beak,不用再让再无意义程序递归下去,比如这道题目,在该题目中,每个结点都有自己的一个取值,互相独立,所以不需要v[i]标记,而是一个for循环的遍历,以自己的取值域为判断。
void dfs(int n)
{
int i;
if(n>x) //递归到最深再判断
jude();
for(i=1;i<=x;i++)
if(v[i])
{
v[i] = 0;
a[n] = i;
dfs(n+1);
v[i] = 1;//如果递归取值共用一个集合的话,需要用这样一个数组来标志。
}
}