寻找林克的回忆(1)数独

【题目】来源:xmuoj

【知识点】 DFS+链表+二进制压缩

    

【核心代码】

  1. 1.  bool dfs(int cnt){  
  2. 2.  if (cnt==0) // 所有空格都得到了合法答案,返回  
  3. 3.  return true;  
  4. 4.  list::iterator it=find(); // 启发搜索,取得当前选择最少的点  
  5. 5.  int x=it->x,y=it->y;  
  6. 6.  int choice=getchoice(x,y);  // 获取该点可选数字的二进制集合  
  7. 7.  it=blank.erase(it); // 删去该点  
  8. 8.    
  9.    
  10. 9.  while (choice){  
  11. 10. int key=getnum(lowbit(choice)); // 获取可选数字  
  12. 11. add(x,y,key);   // 记录可选数字  
  13. 12. if (dfs(cnt-1)) // 向下递归  
  14. 13. return true;;  // 如果返回 true 说明已经找到答案,返回  
  15. 14. remove(x,y,key);    // 删去可选数字的记录  
  16.   
  17. 15. choice^=lowbit(choice); // 获取下一个可选数字  
  18. 16. }     
  19. 17. blank.insert(it,Coordinate{x,y});   // 复原,插入该点  
  20. 18. return false;     
  21. 19.}          
  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值