题目传送门

显然是一个搜索。但是开始没有任何的剪枝,暴力从\((1,1)\)点开始搜索,很自然地T了6个点。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int group[10][10]=
  5. {
  6. 0,0,0,0,0,0,0,0,0,0,
  7. 0,1,1,1,2,2,2,3,3,3,
  8. 0,1,1,1,2,2,2,3,3,3,
  9. 0,1,1,1,2,2,2,3,3,3,
  10. 0,4,4,4,5,5,5,6,6,6,
  11. 0,4,4,4,5,5,5,6,6,6,
  12. 0,4,4,4,5,5,5,6,6,6,
  13. 0,7,7,7,8,8,8,9,9,9,
  14. 0,7,7,7,8,8,8,9,9,9,
  15. 0,7,7,7,8,8,8,9,9,9,
  16. };
  17. const int sco[10][10]=
  18. {
  19. 0,0,0,0,0,0,0,0,0,0,
  20. 0,6,6,6,6,6,6,6,6,6,
  21. 0,6,7,7,7,7,7,7,7,6,
  22. 0,6,7,8,8,8,8,8,7,6,
  23. 0,6,7,8,9,9,9,8,7,6,
  24. 0,6,7,8,9,10,9,8,7,6,
  25. 0,6,7,8,9,9,9,8,7,6,
  26. 0,6,7,8,8,8,8,8,7,6,
  27. 0,6,7,7,7,7,7,7,7,6,
  28. 0,6,6,6,6,6,6,6,6,6,
  29. };
  30. int ans,num[50][50];
  31. bool gong[50][50],hang[50][50],lie[50][50];
  32. void review()
  33. {
  34. int val=0;
  35. for(int i=1;i<=9;i++)
  36. for(int j=1;j<=9;j++)
  37. val+=sco[i][j]*num[i][j];
  38. // printf("%d\n",val);
  39. ans=max(ans,val);
  40. }
  41. bool check(int x,int y,int w)
  42. {
  43. if(gong[group[x][y]][w]||hang[x][w]||lie[y][w]) return 0;
  44. return 1;
  45. }
  46. void dfs(int x,int y)
  47. {
  48. if(x==10)
  49. {
  50. review();
  51. return ;
  52. }
  53. int nx=x,ny=y+1;
  54. if(ny==10) nx++,ny=1;
  55. if(num[x][y]) dfs(nx,ny);
  56. else
  57. {
  58. for(int i=1;i<=9;i++)
  59. {
  60. if(!check(x,y,i)) continue;
  61. gong[group[x][y]][i]=1;
  62. hang[x][i]=1;
  63. lie[y][i]=1;
  64. num[x][y]=i;
  65. dfs(nx,ny);
  66. gong[group[x][y]][i]=0;
  67. hang[x][i]=0;
  68. lie[y][i]=0;
  69. num[x][y]=0;
  70. }
  71. }
  72. }
  73. int main()
  74. {
  75. for(int i=1;i<=9;i++)
  76. for(int j=1;j<=9;j++)
  77. {
  78. int x=0;
  79. scanf("%d",&x);
  80. if(!x) continue;
  81. num[i][j]=x;
  82. hang[i][x]=1;
  83. lie[j][x]=1;
  84. gong[group[i][j]][x]=1;
  85. }
  86. dfs(1,1);
  87. printf("%d",ans==0 ? -1 : ans);
  88. return 0;
  89. }

考虑剪枝。从人类智慧的角度出发,如果是我们玩数独虽然我好像没怎么玩过,我们一定是从填的多的区域出发,因为有更少的决策可供我们选择。那么在这里我们也可以借鉴这个思路,每次统计一下每行每列的有多少数是已经填了的,得到一个最优的坐标,从它出发进行搜索。这个算法保证了我们每次搜的一定是没有填数的,使复杂度优秀了许多。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int group[10][10]=
  5. {
  6. 0,0,0,0,0,0,0,0,0,0,
  7. 0,1,1,1,2,2,2,3,3,3,
  8. 0,1,1,1,2,2,2,3,3,3,
  9. 0,1,1,1,2,2,2,3,3,3,
  10. 0,4,4,4,5,5,5,6,6,6,
  11. 0,4,4,4,5,5,5,6,6,6,
  12. 0,4,4,4,5,5,5,6,6,6,
  13. 0,7,7,7,8,8,8,9,9,9,
  14. 0,7,7,7,8,8,8,9,9,9,
  15. 0,7,7,7,8,8,8,9,9,9,
  16. };
  17. const int sco[10][10]=
  18. {
  19. 0,0,0,0,0,0,0,0,0,0,
  20. 0,6,6,6,6,6,6,6,6,6,
  21. 0,6,7,7,7,7,7,7,7,6,
  22. 0,6,7,8,8,8,8,8,7,6,
  23. 0,6,7,8,9,9,9,8,7,6,
  24. 0,6,7,8,9,10,9,8,7,6,
  25. 0,6,7,8,9,9,9,8,7,6,
  26. 0,6,7,8,8,8,8,8,7,6,
  27. 0,6,7,7,7,7,7,7,7,6,
  28. 0,6,6,6,6,6,6,6,6,6,
  29. };
  30. int cn,ans,num[50][50];
  31. int cnt_hang[50],cnt_lie[50];
  32. bool gong[50][50],hang[50][50],lie[50][50];
  33. void review()
  34. {
  35. int val=0;
  36. for(int i=1;i<=9;i++)
  37. for(int j=1;j<=9;j++)
  38. val+=sco[i][j]*num[i][j];
  39. // printf("%d\n",val);
  40. ans=max(ans,val);
  41. }
  42. bool check(int x,int y,int w)
  43. {
  44. if(gong[group[x][y]][w]||hang[x][w]||lie[y][w]) return 0;
  45. return 1;
  46. }
  47. void dfs(int x,int y,int cnt)
  48. {
  49. if(cnt==81)
  50. {
  51. review();
  52. return ;
  53. }
  54. for(int i=1;i<=9;i++)
  55. {
  56. if(!check(x,y,i)) continue;
  57. gong[group[x][y]][i]=1;
  58. hang[x][i]=1;
  59. lie[y][i]=1;
  60. num[x][y]=i;
  61. cnt_hang[x]++;cnt_lie[y]++;
  62. int qwq=-1,qaq=-1,bx=0,by=0;
  63. for(int j=1;j<=9;j++)
  64. if(cnt_hang[j]>qwq&&cnt_hang[j]<9)
  65. qwq=cnt_hang[j],bx=j;
  66. for(int j=1;j<=9;j++)
  67. if(cnt_lie[j]>qaq&&(!num[bx][j]))
  68. qaq=cnt_lie[j],by=j;
  69. dfs(bx,by,cnt+1);
  70. gong[group[x][y]][i]=0;
  71. hang[x][i]=0;
  72. lie[y][i]=0;
  73. num[x][y]=0;
  74. cnt_hang[x]--;cnt_lie[y]--;
  75. }
  76. }
  77. int main()
  78. {
  79. for(int i=1;i<=9;i++)
  80. for(int j=1;j<=9;j++)
  81. {
  82. int x=0;
  83. scanf("%d",&x);
  84. if(!x) continue;
  85. num[i][j]=x;
  86. cnt_hang[i]++;
  87. cnt_lie[j]++;
  88. hang[i][x]=1;
  89. lie[j][x]=1;
  90. gong[group[i][j]][x]=1;
  91. cn++;
  92. }
  93. int qwq=-1,qaq=-1,bx=0,by=0;
  94. for(int i=1;i<=9;i++)
  95. if(cnt_hang[i]>qwq&&cnt_hang[i]<9)
  96. qwq=cnt_hang[i],bx=i;
  97. for(int i=1;i<=9;i++)
  98. if(cnt_lie[i]>qaq&&(!num[bx][i]))//注意这里找一个没有填数的坐标
  99. qaq=cnt_lie[i],by=i;
  100. dfs(bx,by,cn);
  101. printf("%d",ans==0 ? -1 : ans);
  102. return 0;
  103. }

Warning

开始写自己的暴力写法的时候傻了两次:

①没输入输出(???)果然T的无可救药

②因为我确定宫和价值都是用数组打出表存的,而开始把数组开的很大,\(50*50\),但是我们打出的表的部分不是另起一行,编译后会被理解连续的一段,于是我们要限制数组大小,使恰好能够填入数。

Luogu P1074靶形数独【搜索/剪枝】By cellur925的更多相关文章

  1. 洛谷P1074 靶形数独 [搜索]

    题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...

  2. luogu P1074 靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  3. P1074 靶形数独

    P1074 靶形数独正着搜80分,完全倒置95分,完全倒置后左右再倒置,就会A掉,到时候脑洞要大一些. #include<iostream> #include<cstdio> ...

  4. 洛谷——P1074 靶形数独

    P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z ...

  5. 洛谷 P1074 靶形数独(剪枝)

    //人生中第一道蓝题(3.5h) 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请 ...

  6. P1074 靶形数独题解

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...

  7. [洛谷P1074] 靶形数独

    洛谷题目链接:靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博 ...

  8. [NOIP2009] 提高组 洛谷P1074 靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  9. 洛谷—— P1074 靶形数独

    https://www.luogu.org/problem/show?pid=1074 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但 ...

随机推荐

  1. xmanager 5图文使用教程

    1.Xconfig xconfig是linux下X Window环境中用于配制的一个工具,和menuconfig相似,但用法更友好方便. 当你创建一个会话,会话分配一个默认的配置文件.Xmanager ...

  2. 区块链+AI将给区块链带来怎样的改变?

    区块链和人工智能技术都是互联网时代最新.最热的技术,不仅可以改变我们生活,还能产生巨大的财富,为此国家大力支持发展,科技巨头们也纷纷布局.那区块链与人工智能结合,对区块链技术而言会产生什么样的化学反应 ...

  3. Vue中的methods、watch、computed

    看到这个标题就知道这篇文章接下来要讲的内容,我们在使用vue的时候methods.watch.computed这三个特性一定经常使用,因为它们是非常的有用,但是没有彻底的理解它们的区别和各自的使用场景 ...

  4. UVA10689 Yet another Number Sequence —— 斐波那契、矩阵快速幂

    题目链接:https://vjudge.net/problem/UVA-10689 题解: 代码如下: #include <iostream> #include <cstdio> ...

  5. git rev-list 和 git rev-parse

    git-rev-list - Lists commit objects in reverse chronological order https://git-scm.com/docs/git-rev- ...

  6. codeforces B. Bear and Strings 解题报告

    题目链接:http://codeforces.com/problemset/problem/385/B 题目意思:给定一条只有小写英文组成的序列,需要找出至少包含一个“bear”的单词的子序列个数.注 ...

  7. python中通过xlwt、xlrd和xlutils操作xls

    xlwt模块用于在内存中生成一个xls/xlsx对象,增加表格数据,并把内存中的xls对象保存为本地磁盘xls文件; xlrd模块用于把本地xls文件加载到内存中,可以读取xls文件的表格数据,查询x ...

  8. CodeForces526F:Pudding Monsters (分治)

    In this problem you will meet the simplified model of game Pudding Monsters. An important process in ...

  9. CTSC2012 熟悉的文章

    传送门 首先很容易想到对于所有的模式串建出广义后缀自动机,之后对于我们每一个要检查的文本串,先在SAM上跑,计算出来每一个位置能匹配到的最远的位置是多少.(就是当前点减去匹配长度) 之后--考虑DP- ...

  10. P2383 狗哥玩木棒

    题目背景 狗哥又趁着语文课干些无聊的事了... 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入输出格式 输入格式: 输入文件中的第一行是一个整数n表示测试 ...