记录编号 126986 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2009]靶形数独 最终得分 100
用户昵称 Gravatar席一鸣 是否通过 通过
代码语言 C++ 运行时间 2.404 s
提交时间 2014-10-14 19:45:15 内存使用 0.31 MiB
显示代码纯文本
  1. #include<cmath>
  2. #include<cstdio>
  3. #include<iostream>
  4. using namespace std;
  5. int a[10][10],h[10],hs[10],ss[10],nine[10],sort[10],q[10],ans=-1,st=511;
  6. void swap(int*a,int*b)
  7. {
  8. *a^=*b;
  9. *b^=*a;
  10. *a^=*b;
  11. }
  12. int ten(int x)
  13. {
  14. return(int)log2(x)+1;
  15. }
  16. void dfs(int k)
  17. {
  18. int c,i,j,l,get,num,pos,p;
  19. if(k==10)
  20. {
  21. c=a[5][5]*10;
  22. for(l=2;l<=5;l++)
  23. {
  24. for(i=l;i<=10-l;i++)
  25. c+=(4+l)*(a[i][l-1]+a[i][11-l]);
  26. for(j=l;j<=10-l;j++)
  27. c+=(4+l)*(a[l-1][j]+a[11-l][j]);
  28. c+=(4+l)*(a[l-1][l-1]+a[l-1][11-l]+a[11-l][l-1]+a[11-l][11-l]);
  29. }
  30. ans=max(ans,c);
  31. }
  32. else
  33. {
  34. i=sort[k];
  35. pos=st&~h[i];
  36. p=pos&-pos;
  37. h[i]|=p;
  38. j=ten(p);
  39. get=st&~(hs[i]|ss[j]|nine[(i-1)/3*3+(j-1)/3+1]);
  40. while(get)
  41. {
  42. num=get&-get;
  43. get^=num;
  44. a[i][j]=ten(num);
  45. hs[i]|=num;
  46. ss[j]|=num;
  47. nine[(i-1)/3*3+(j-1)/3+1]|=num;
  48. if(pos==p)
  49. dfs(k+1);
  50. else
  51. dfs(k);
  52. hs[i]^=num;
  53. ss[j]^=num;
  54. nine[(i-1)/3*3+(j-1)/3+1]^=num;
  55. }
  56. h[i]^=p;
  57. }
  58. }
  59. main()
  60. {
  61. freopen("sudoku.in","r",stdin);
  62. freopen("sudoku.out","w",stdout);
  63. int i,j,k=1;
  64. for(i=1;i<=9;i++)
  65. for(j=1;j<=9;j++)
  66. {
  67. sort[i]=i;
  68. cin>>a[i][j];
  69. if(a[i][j])
  70. {
  71. h[i]|=1<<(j-1);
  72. if(((hs[i]|ss[j]|nine[(i-1)/3*3+(j-1)/3+1])&(1<<(a[i][j]-1)))==1)
  73. {
  74. cout<<-1;
  75. return 0;
  76. }
  77. hs[i]|=1<<(a[i][j]-1);
  78. ss[j]|=1<<(a[i][j]-1);
  79. nine[(i-1)/3*3+(j-1)/3+1]|=1<<(a[i][j]-1);
  80. }
  81. else
  82. q[i]++;
  83. }
  84. for(i=1;i<9;i++)
  85. for(j=i+1;j<=9;j++)
  86. if(q[sort[i]]>q[sort[j]])
  87. swap(&sort[i],&sort[j]);
  88. while(!q[sort[k]])
  89. k++;
  90. dfs(k);
  91. cout<<ans;
  92. }