总结:
本题依然是典型的DFS题目,状态空间很好想,就是x即第几个人,关键是每个人喜欢两本书如何存储此状态,有点懵,看了下题解,比较好的办法就是设置like[i][j]数组,表示第i个人喜欢第j本书,一个简单的二维数组巧妙地解决了这个问题,接下来就是递归搜索:
注意有易错点:
1.当ans=x时放在for循环语句里,计数加1,此时不要return,并不是每个递归终止都要写return语句,写了后本题会报错,因此需要就题论题,思维不能僵化;
2.回溯语句都要放在else外面,之前刷题时也注意到,这里在强化记忆下!!!
void DFS(int ans)
{
int j;
for(int j=1;j<=x;j++)
{
if(!vis[j]&&like[ans][j]) //表示第j本书还没有被选过且第ans个人恰好喜欢第j本书
{
vis[j]=true;
book[ans]=j;
if(ans==x) count1++;
else DFS(ans+1);
vis[j]=false;
book[ans]=0; //回溯过程
}
}
}
洛谷P1657选书总结
最新推荐文章于 2021-12-16 20:47:34 发布