记录编号 174052 评测结果 AAAAAAAAAAAAAAAAAATA
题目名称 [NOIP 2009]靶形数独 最终得分 95
用户昵称 Gravatardevil 是否通过 未通过
代码语言 C++ 运行时间 2.527 s
提交时间 2015-07-31 10:09:31 内存使用 0.32 MiB
显示代码纯文本
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cmath>
  5. #include <queue>
  6. #include <vector>
  7. #include <stack>
  8. #include <map>
  9. #include <ctime>
  10. #include <cstring>
  11. #include <algorithm>
  12. using namespace std;
  13. typedef long long ll;
  14. typedef unsigned long long ull;
  15. typedef unsigned int uint;
  16. const int maxn=2000010;
  17. const int maxm=90010;
  18. const int MAX_INT=0x7fffffff;
  19. const int max_int=1061109567;
  20. const int mod=12345;
  21.  
  22. int sorce[15][15]={
  23. {6,6,6,6, 6,6,6,6,6},
  24. {6,7,7,7, 7,7,7,7,6},
  25. {6,7,8,8, 8,8,8,7,6},
  26. {6,7,8,9, 9,9,8,7,6},
  27. {6,7,8,9,10,9,8,7,6},
  28. {6,7,8,9, 9,9,8,7,6},
  29. {6,7,8,8, 8,8,8,7,6},
  30. {6,7,7,7, 7,7,7,7,6},
  31. {6,6,6,6, 6,6,6,6,6}
  32. };
  33.  
  34. int num[15][15];int ans=0;
  35. bool vis_x[15][10],vis_y[15][10],vis_e[10][10];
  36.  
  37. void check_point()
  38. {
  39. int s=0;
  40. for(int i=0;i<9;i++)
  41. {
  42. for(int j=0;j<9;j++)
  43. s+=num[i][j]*sorce[i][j];
  44. }
  45. if(s>ans) ans=s;
  46. }
  47.  
  48. void dfs(int x,int y)
  49. {
  50. if(y==-1) {x--;y=8;}
  51. if(x==-1) {check_point();return;}
  52. if(num[x][y]!=0) dfs(x,y-1);
  53. else
  54. {
  55. int t=x/3*3+y/3;
  56. for(int i=1;i<=9;i++)
  57. {
  58. if(!vis_x[x][i]&&!vis_y[y][i]&&!vis_e[t][i])
  59. {
  60. vis_x[x][i]=vis_y[y][i]=vis_e[t][i]=true;
  61. num[x][y]=i;
  62. dfs(x,y-1);
  63. vis_x[x][i]=vis_y[y][i]=vis_e[t][i]=false;
  64. num[x][y]=0;
  65. }
  66. }
  67. }
  68. }
  69.  
  70. int main()
  71. {
  72. //freopen("data.in","r",stdin);
  73. //freopen("data.out","w",stdout);
  74. freopen("sudoku.in","r",stdin);
  75. freopen("sudoku.out","w",stdout);
  76. clock_t st=clock();
  77. for(int i=0;i<9;i++)
  78. {
  79. for(int j=0;j<9;j++)
  80. {
  81. scanf("%d",&num[i][j]);
  82. vis_x[i][num[i][j]]=true;
  83. vis_y[j][num[i][j]]=true;
  84. vis_e[i/3*3+j/3][num[i][j]]=true;
  85. }
  86. }
  87. dfs(8,8);
  88. if(ans==0) printf("-1\n");
  89. else printf("%d\n",ans);
  90. clock_t et=clock();
  91. //printf("\nTime used : %.4lf Ms\n",double(et-st)/CLOCKS_PER_SEC);
  92. return 0;
  93. }