2018激光样式

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. /*
  4. dfs(i) 第i个激光机器 有两种选择:vis[i-1] == 0 时 可选,无论vis[i-1]为何值都不选
  5. vis[i] 回溯标记是否用过
  6. */
  7. int n = 30;
  8. int vis[35];
  9. int ans = 0;
  10. int dp[35];
  11. void dfs(int x){
  12. if(x == n+1){
  13. ans++;
  14. return;
  15. }
  16. dfs(x+1); //这个点不开激光
  17. if(vis[x-1] == 0){//前一个点没开激光 那么这个点可以开激光: vis[x] = 1就表示开激光
  18. vis[x] = 1;
  19. dfs(x+1);
  20. vis[x] = 0;//回溯
  21. }
  22. }
  23. int main(){
  24. for(int i=1;i<=30;i++) vis[i] = 0;
  25. dfs(1);
  26. cout<<ans<<endl;
  27. return 0;
  28. }
  29. //2178309

 

 

2017磁砖样式

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,m;
  4. const int maxn = 10;
  5. int g[maxn][maxn];
  6. vector<int> v;
  7. set<vector<int> > se;
  8. set<vector<int> > se2;
  9. map<int, int> Hash;
  10. int ans = 0;
  11. bool check_color() {
  12. for(int i = 1; i <= n; i++)
  13. for(int j = 1; j <= m; j++) {
  14. if(i+1 <= n && j+1 <= m) {
  15. //1 1 1 1 2 2 2 2 1 2 1 2
  16. if((g[i][j]+g[i][j+1]+g[i+1][j]+g[i+1][j+1]) % 4 == 0)
  17. return false;
  18. }
  19. }
  20. return true;
  21. }
  22. bool check2(){
  23. for(int i=1;i<=n;i++){
  24. for(int j=1;j<=m;j++){
  25. if(g[i][j] == 0){
  26. return false;
  27. }
  28. }
  29. }
  30. for(int i=1;i<=n-1;i++){
  31. for(int j=1;j<=m-1;j++){
  32. int aa = g[i][j];
  33. int bb = g[i+1][j];
  34. int cc = g[i][j+1];
  35. int dd = g[i+1][j+1];
  36. if(aa == bb && aa ==cc && bb== cc && cc == dd && bb == dd && aa == dd){
  37. return false;
  38. }
  39. }
  40. }
  41. return true;
  42. }
  43. bool check(){
  44. for(int i=1;i<=n;i++){
  45. for(int j=1;j<=m;j++){
  46. if(g[i][j] == 0){
  47. return false;
  48. }
  49. }
  50. }
  51. for(int i=1;i<=n-1;i++){
  52. for(int j=1;j<=m-1;j++){
  53. if(g[i][j] == g[i+1][j] == g[i][j+1] == g[i+1][j+1])
  54. return false;
  55. }
  56. }
  57. return true;
  58. }
  59. void dfs(int x,int y){
  60. if(x == n+1 && y == 1){
  61. // for(int i=1;i<=n;i++){
  62. // for(int j=1;j<=m;j++){
  63. // cout<<g[i][j]<<" ";
  64. // }
  65. // cout<<endl;
  66. // }
  67. if(check_color()){
  68. v.clear();
  69. for(int i=1;i<=n;i++){
  70. for(int j=1;j<=m;j++){
  71. v.push_back(g[i][j]);
  72. }
  73. }
  74. se.insert(v);
  75. }
  76. if(check2()){
  77. v.clear();
  78. for(int i=1;i<=n;i++){
  79. for(int j=1;j<=m;j++){
  80. v.push_back(g[i][j]);
  81. }
  82. }
  83. se2.insert(v);
  84. }
  85. return;
  86. }
  87. if(g[x][y]){
  88. if(y == m)
  89. dfs(x+1,1);
  90. else
  91. dfs(x,y+1);
  92. }else{
  93. if(y+1 <= m && !g[x][y+1]){
  94. for(int i=1;i<=2;i++){
  95. g[x][y+1] = i;
  96. g[x][y] = i;
  97. if(y == m){
  98. dfs(x+1,1);
  99. }else{
  100. dfs(x,y+1);
  101. }
  102. g[x][y] = 0;
  103. g[x][y+1] = 0;
  104. }
  105. }
  106. if(x+1 <= n && !g[x+1][y]){
  107. for(int i=1;i<=2;i++){
  108. g[x+1][y] = i;
  109. g[x][y] = i;
  110. if(y == m){
  111. dfs(x+1,1);
  112. }else{
  113. dfs(x,y+1);
  114. }
  115. g[x+1][y] = 0;
  116. g[x][y] = 0;
  117. }
  118. }
  119. }
  120. }
  121. int main(){
  122. n = 3, m =10;
  123. dfs(1,1);
  124. cout<<se2.size()<<endl;
  125. cout<<se.size()<<endl;
  126. set<vector<int> >::iterator it = se2.begin();
  127. vector<int> vv;
  128. while(it != se2.end()){
  129. if(se2.find(*it) != se2.end() && se.find(*it) == se.end() ){
  130. vv = *it;
  131. break;
  132. }
  133. it++;
  134. }
  135. int t = 0;
  136. for(int i=0;i<vv.size();i++){
  137. if(t == 10) {
  138. t = 0;
  139. cout<<endl;
  140. }
  141. cout<<vv[i]<<" ";
  142. t++;
  143. }
  144. cout<<endl;
  145. return 0;
  146. }
  147. //123996我的答案 check函数 是错的?!! check2函数是对的
  148. //101466网上答案 是对的!!
  149. //原因:检查颜色的函数出错 为什么? 不能连等判断。。。。。这语法
  150. //已改正
  151. /*
  152. 1 1 1 1 1 1 1 1 1 1
  153. 1 2 1 2 2 1 2 2 1 2
  154. 1 2 2 2 2 2 1 1 1 2
  155. */

 

 

2016凑平方数

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. /*
  4. 分成几组? k组 1 ~ 10;
  5. 每组:dfs搜索0~9这几个没用过的数;
  6. if 完全平方数
  7. 1.x+1
  8. 2.继续加值 (0不能作为第一个数 单独考虑)
  9. 到了k组 先对结果排序存到vector数组中 再set去重(因为递归回溯 结果有大量重复)
  10. 注意:必须用long long...用int会出错 因为int的取值范围为:-2147483648 ~ 2147483647
  11. */
  12. typedef long long ll;
  13. int vis[15];
  14. ll a[15];
  15. vector<ll> v;
  16. int vis2[10];
  17. int k;
  18. int ans = 0;
  19. set<vector<ll> > se;
  20. inline bool check(ll x){
  21. if(x == 9814072356){
  22. int eeeeee = 1;
  23. }
  24. double d = sqrt(x);
  25. return d == (ll)d;
  26. }
  27. //因为递归回溯有大量重复 改成set去重
  28. void dfs(int x,ll cur){
  29. if(x == k){
  30. for(int i=0;i<10;i++){
  31. vis2[i] = 0;
  32. }
  33. for(int i=0;i<k;i++){
  34. ll d = a[i];
  35. if(d == 0) vis2[d] = 1;
  36. else{
  37. while(d){
  38. vis2[d%10] = 1;
  39. d = d/10;
  40. }
  41. }
  42. }
  43. for(int i=0;i<=9;i++){
  44. if(!vis2[i]) return;
  45. }
  46. for(int i=0;i<k;i++) v.push_back(a[i]);
  47. sort(v.begin(),v.end());
  48. if(se.find(v) == se.end()){
  49. for(int i=0;i<k;i++) cout<<v[i]<<" ";
  50. cout<<endl;
  51. se.insert(v);
  52. }
  53. v.clear();
  54. ans++;
  55. return;
  56. }
  57. for(int i=0;i<=9;i++){
  58. if(!vis[i]){
  59. vis[i] = 1;
  60. if(cur == 0 && i == 0){//如果是以0开头 并且当前搜索的是一个新的分组(cur值为0) 就直接搜索下一组
  61. a[x] = 0;
  62. dfs(x+1,0);
  63. vis[i] = 0;
  64. continue;
  65. }
  66. ll num = cur*10+i;
  67. if(check(num)){
  68. a[x] = num;
  69. dfs(x+1,0);
  70. } //搜索下一分组
  71. dfs(x,cur*10+i);//继续搜索当前分组
  72. vis[i] = 0;
  73. }
  74. }
  75. }
  76. int main(){
  77. //freopen("out1.txt","w",stdout);
  78. //枚举分组的次数
  79. for(k = 1;k <= 10;k++){
  80. memset(vis,0,sizeof(vis));
  81. dfs(0,0);
  82. }
  83. cout<<ans<<endl;
  84. cout<<se.size()<<endl;
  85. return 0;
  86. }
  87. //3085
  88. //300

 

 

2015完美正方形

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n = 47 + 46 + 61;//边长
  4. int a[19] = {2, 5, 9, 11, 16, 17, 19, 21, 22, 24, 26, 30, 31, 33, 35, 36, 41, 50, 52};
  5. int g[500][500];//大正方形地图
  6. int vis[30];
  7. set<int> se;//集合存储正方形最后一行边长数据结果
  8. void fill(int x,int y,int l,int num){
  9. for(int i=x;i<=x+l-1;i++){
  10. for(int j=y;j<=y+l-1;j++){
  11. g[i][j] = num;
  12. }
  13. }
  14. }
  15. bool ok(int x,int y,int l){
  16. if(x+l-1 > n) return false;
  17. if(y+l-1 > n) return false;
  18. for(int i=x;i<=x+l-1;i++){
  19. for(int j=y;j<=y+l-1;j++){
  20. if(g[i][j] != 0) return false;
  21. }
  22. }
  23. return true;
  24. }
  25. bool check(){
  26. return true;
  27. }
  28. void dfs(int x,int y){
  29. if(x == n+1){//递归出口
  30. if(check()){
  31. for(int i=1;i<=n;i++){
  32. se.insert(g[n][i]);//set集合存储最后一层正方形边长数据
  33. }
  34. }
  35. return;
  36. }
  37. if(g[x][y] != 0 ){//当前正方形填充过了
  38. if(y == n)
  39. dfs(x+1,1);//dfs下一个
  40. else
  41. dfs(x,y+1);//dfs下一个
  42. }else{//当前正方形没有填充过
  43. for(int i=0;i<19;i++){//枚举19块正方形
  44. if(!vis[i]){
  45. if(ok(x,y,a[i])){
  46. fill(x,y,a[i],a[i]);//填充正方形成a[i]边长 以(x,y)为左上顶点
  47. vis[i] = 1;
  48. if(y == n){
  49. dfs(x+1,1);//dfs下一个
  50. }else{
  51. dfs(x,y+1);//dfs下一个
  52. }
  53. vis[i] = 0;//回溯
  54. fill(x,y,a[i],0);//填充正方形成0 以(x,y)为左上顶点
  55. }else{
  56. break;//剪枝 因为a数组按顺序排的 当前边长不行 后面边长更不行了
  57. }
  58. }
  59. }
  60. }
  61. }
  62. int main(){
  63. fill(1,1,47,47);//填充以(1,1)为左上顶点的正方形 边为47
  64. fill(1,47+1,46,46);
  65. fill(1,47+46+1,61,61);
  66. dfs(1,1);//从(1,1)点开始搜索
  67. set<int>::iterator it = se.begin();
  68. while(it!=se.end()){
  69. cout<<*it<<" ";
  70. it++;
  71. }
  72. return 0;
  73. }
  74. //30 33 41 50

 

 

蓝桥杯dfs搜索专题的更多相关文章

  1. 方格填数--蓝桥杯---dfs

    答案:1580 相似题目:N皇后问题 注意要枚举的是什么 #include<iostream> #include<string.h> using namespace std; ...

  2. 四阶幻方-蓝桥杯-DFS

    答案:416 用next_permutation()全部排列的话会超时 所以用dfs搜索,只搜索前三行就好,前三行确定之后,第四行也就确定 #include<iostream> #incl ...

  3. 寒假作业---蓝桥杯---DFS

    题目描述 现在小学的数学题目也不是那么好玩的. 看看这个寒假作业: 每个方块代表1~13中的某一个数字,但不能重复. 比如: 6  + 7 = 13 9  - 8 = 1 3  * 4 = 12 10 ...

  4. 穿越雷区--蓝桥杯--DFS/BFS

    题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? ...

  5. java实现第六届蓝桥杯密文搜索

    密文搜索 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料 ...

  6. 蓝桥杯 历届试题 剪格子(dfs搜索)

    历届试题 剪格子 时间限制:1.0s   内存限制:256.0MB 问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |* || +--****--+ ||* | ** ...

  7. 蓝桥杯 历届试题 网络寻路(dfs搜索合法路径计数)

    X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径 ...

  8. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  9. 蓝桥杯---剪格子(DFS&BFS)(小总结)

    问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+ ...

随机推荐

  1. Centos7.6 Apache 虚拟机禁止访问IP,允许访问多域名多个虚拟目录设置

    存放配置文件路径 /etc/httpd/conf.d自定义命名,配置文件后缀格式确保 *.conf注:这是两个配置文件,也是两种方法. # 一个WEB目录# 禁止以IP地址形式访问<Virtua ...

  2. LInux:网络连接的设置

    主机名的配置 主机名的配置(配置文件/etc/hostname) 1.使用 hostname 命令临时设置主机名 命令格式:hostname [新主机名] 2.永久设置主机名 命令格式:hostnam ...

  3. Leetcode 90. 子集 II

    地址  https://leetcode-cn.com/problems/subsets-ii/ 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重 ...

  4. WPF (DataGridRowHeaderStyle)实现自义定行样式 并绑定数据

    原文:WPF (DataGridRowHeaderStyle)实现自义定行样式 并绑定数据 功能阐述 就上面那图片 刚开始 考虑使用 RowHeaderTemplate 来实现  发现总绑定不上数据  ...

  5. 简单App项目的运行

    我和我的同伴两个人从网上下载一个仿微信登录源码,导入到eclipse中,两人结队练习这个源代码的操作, 运行项目到Android虚拟器上,显示效果为 我们还运行这个项目到手机设备上,显示效果为   接 ...

  6. UOJ #450. 【集训队作业2018】复读机

    前置知识单位根反演自己去浅谈单位根反演看(此外可能需要一定的生成函数的姿势) 首先一看\(d\)这么小,那我们来分类讨论一下吧 当\(d=1\)时,显然答案就是\(k^n\) 当\(d=2\)时,如果 ...

  7. Mysql 免安装教程 百度云网盘有文件和word说明

    一 把文件解压到一个目录下 这是解压后的目录 将my.ini文件考进去 双击打开my.ini 找到这两行更改成自己的解压路径保存 右键此电脑属性 找到高级系统设置配置环境变量 新建—>变量值是解 ...

  8. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 10

    18.8  设计完美分页类 数据记录列表几乎出现在Web项目的每个模块中,假设一张表中有十几万条记录,我们不可能一次全都显示出来,当然也不能仅显示几十条.为了解决这样的矛盾,通常在读取时设置以分页的形 ...

  9. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 8-1

    18.6.5  获取数据 PDO的数据获取方法与其他数据库扩展非常类似,只要成功执行SELECT查询,都会有结果集对象生成.不管使用PDO对象中的query()方法,还是使用prepare()和exe ...

  10. laravel中视图的基本使用(七)

    laravel中的视图默认保存在 resources\views 目录下.在控制器中,我们通常使用 view() 方法返回一个视图文件. <?php namespace App\Http\Con ...