当前位置:   article > 正文

数独:深搜+剪枝 == 递归+回溯_递归 剪枝

递归 剪枝

题目描述

数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。

输入描述:
输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。


输出描述:
输出九行,每行九个空格隔开的数字,为解出的答案。
思路:深搜+剪枝 == 递归+回溯
凡是类似于迷宫的寻找路径的问题,均可由“递归+回溯”。
本题中,从第一个为0处开始填值,从1-9依次往里填i,如果当前填的值i深搜的结果为false,则把其状态还原(回溯),然后继续填下个值i+1。依次递归下去,当一直找到(9,9)时,即成功。
特别注意:每行不能多输出个空格,即使看不见,也不能多输出一个空格。
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cstring>
  4. using namespace std;
  5. #define N 10
  6. int hashrow[N][N];
  7. int hashcol[N][N];
  8. int hashblock[N][N];
  9. int array[N][N];
  10. bool dfs(int i,int j){
  11. while(array[i][j]!=0){
  12. if(i==9&&j==9){
  13. return true;
  14. }else if(j==9){
  15. i++;
  16. j=1;
  17. }
  18. else
  19. j++;
  20. }
  21. for (int k = 1; k <=9 ; ++k)
  22. {
  23. if(hashrow[i][k]==0&&hashcol[j][k]==0&&hashblock[(i-1)/3*3+(j-1)/3+1][k]==0){
  24. array[i][j]=k;
  25. hashrow[i][k]=1;
  26. hashcol[j][k]=1;
  27. hashblock[(i-1)/3*3+(j-1)/3+1][k]=1;
  28. if(dfs(i,j)==true)
  29. return true;
  30. array[i][j]=0; //深搜+剪枝 回溯法
  31. hashrow[i][k]=0;
  32. hashcol[j][k]=0;
  33. hashblock[(i-1)/3*3+(j-1)/3+1][k]=0;
  34. }
  35. }
  36. return false;//填当前空格时,从1到9,没有一个能成功,则返回.
  37. }
  38. int main()
  39. {
  40. memset(hashrow,0,sizeof(hashrow));
  41. memset(hashcol,0,sizeof(hashcol));
  42. memset(hashblock,0,sizeof(hashblock));
  43. for (int i = 1; i <= 9; ++i)
  44. {
  45. for (int j = 1; j <= 9; ++j)
  46. {
  47. cin>>array[i][j];
  48. hashrow[i][array[i][j]]=1;//
  49. hashcol[j][array[i][j]]=1;
  50. hashblock[(i-1)/3*3+(j-1)/3+1][array[i][j]]=1;
  51. }
  52. }
  53. if(dfs(1,1))
  54. {
  55. for (int i = 1; i <= 9; ++i)
  56. {
  57. for (int j = 1; j <= 8; ++j)
  58. {
  59. cout<<array[i][j]<<" ";//每行的最后不能多输出一个空格。
  60. }
  61. cout<<array[i][9]<<endl;//最后不能多输出一个空格。
  62. }
  63. }
  64. return 0;
  65. }



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/434265
推荐阅读
相关标签
  

闽ICP备14008679号