2018激光样式

#include<bits/stdc++.h>
using namespace std;/*
dfs(i) 第i个激光机器 有两种选择:vis[i-1] == 0 时 可选,无论vis[i-1]为何值都不选
vis[i] 回溯标记是否用过
*/
int n = 30;
int vis[35];
int ans = 0;
int dp[35];void dfs(int x){if(x == n+1){ans++;return;}dfs(x+1); //这个点不开激光 if(vis[x-1] == 0){//前一个点没开激光 那么这个点可以开激光: vis[x] = 1就表示开激光 vis[x] = 1;dfs(x+1);vis[x] = 0;//回溯}
}int main(){for(int i=1;i<=30;i++) vis[i] = 0;dfs(1);cout<<ans<<endl;return 0;
}
//2178309

2017磁砖样式

#include<bits/stdc++.h>
using namespace std;int n,m;
const int maxn = 10;
int g[maxn][maxn];
vector<int> v;
set<vector<int> > se;
set<vector<int> > se2;
map<int, int> Hash;
int ans = 0;bool check_color() {for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) {if(i+1 <= n && j+1 <= m) {//1 1 1 1  2 2 2 2    1 2 1 2  if((g[i][j]+g[i][j+1]+g[i+1][j]+g[i+1][j+1]) % 4 == 0) return false;}}return true;
}bool check2(){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(g[i][j] == 0){return false;}}}for(int i=1;i<=n-1;i++){for(int j=1;j<=m-1;j++){int aa = g[i][j];int bb = g[i+1][j];int cc = g[i][j+1];int dd = g[i+1][j+1]; if(aa == bb && aa ==cc && bb== cc && cc == dd && bb == dd && aa == dd){return false;}}}return true;
}bool check(){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(g[i][j] == 0){return false;}}}for(int i=1;i<=n-1;i++){for(int j=1;j<=m-1;j++){if(g[i][j] == g[i+1][j] == g[i][j+1] == g[i+1][j+1])return false;}}return true;
}void dfs(int x,int y){if(x == n+1 && y == 1){
//      for(int i=1;i<=n;i++){
//          for(int j=1;j<=m;j++){
//              cout<<g[i][j]<<" ";
//          }
//          cout<<endl;
//      }if(check_color()){v.clear();for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){v.push_back(g[i][j]);}}se.insert(v);}if(check2()){v.clear();for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){v.push_back(g[i][j]);}}se2.insert(v);}return;}if(g[x][y]){if(y == m)dfs(x+1,1);elsedfs(x,y+1);}else{if(y+1 <= m && !g[x][y+1]){for(int i=1;i<=2;i++){g[x][y+1] = i;g[x][y] = i;if(y == m){dfs(x+1,1);}else{dfs(x,y+1);}g[x][y] = 0;g[x][y+1] = 0;}}if(x+1 <= n && !g[x+1][y]){for(int i=1;i<=2;i++){g[x+1][y] = i;g[x][y] = i;if(y == m){dfs(x+1,1);}else{dfs(x,y+1);}g[x+1][y] = 0;g[x][y] = 0;}}}
}int main(){n = 3, m =10;dfs(1,1);cout<<se2.size()<<endl; cout<<se.size()<<endl;set<vector<int> >::iterator it = se2.begin();vector<int> vv;while(it != se2.end()){if(se2.find(*it) != se2.end() && se.find(*it) == se.end() ){vv = *it;break;}it++;}int t = 0;for(int i=0;i<vv.size();i++){if(t == 10) {t = 0;cout<<endl;}cout<<vv[i]<<" ";t++;}cout<<endl;return 0;
}
//123996我的答案 check函数 是错的?!!  check2函数是对的
//101466网上答案 是对的!!
//原因:检查颜色的函数出错 为什么? 不能连等判断。。。。。这语法
//已改正
/*
1 1 1 1 1 1 1 1 1 1
1 2 1 2 2 1 2 2 1 2
1 2 2 2 2 2 1 1 1 2
*/

2016凑平方数

#include<bits/stdc++.h>
using namespace std;/*
分成几组? k组 1 ~ 10;
每组:dfs搜索0~9这几个没用过的数; if 完全平方数 1.x+12.继续加值 (0不能作为第一个数 单独考虑)
到了k组 先对结果排序存到vector数组中 再set去重(因为递归回溯 结果有大量重复)注意:必须用long long...用int会出错 因为int的取值范围为:-2147483648 ~ 2147483647
*/
typedef long long ll;
int vis[15];
ll a[15];
vector<ll> v;
int vis2[10];
int k;
int ans = 0;
set<vector<ll> > se;inline bool check(ll x){if(x == 9814072356){int eeeeee = 1;}double d = sqrt(x);return d == (ll)d;
}//因为递归回溯有大量重复  改成set去重
void dfs(int x,ll cur){if(x == k){for(int i=0;i<10;i++){vis2[i] = 0;}for(int i=0;i<k;i++){ll d = a[i];if(d == 0) vis2[d] = 1;else{while(d){vis2[d%10] = 1;d = d/10;}}}for(int i=0;i<=9;i++){if(!vis2[i]) return;}for(int i=0;i<k;i++) v.push_back(a[i]);sort(v.begin(),v.end());if(se.find(v) == se.end()){for(int i=0;i<k;i++) cout<<v[i]<<" ";cout<<endl;se.insert(v);}v.clear();ans++;return;}for(int i=0;i<=9;i++){if(!vis[i]){vis[i] = 1;if(cur == 0 && i == 0){//如果是以0开头 并且当前搜索的是一个新的分组(cur值为0) 就直接搜索下一组 a[x] = 0;dfs(x+1,0);vis[i] = 0;continue;}ll num = cur*10+i;if(check(num)){a[x] = num;dfs(x+1,0);} //搜索下一分组 dfs(x,cur*10+i);//继续搜索当前分组vis[i] = 0;}}
}int main(){//freopen("out1.txt","w",stdout);//枚举分组的次数 for(k = 1;k <= 10;k++){memset(vis,0,sizeof(vis)); dfs(0,0);}cout<<ans<<endl;cout<<se.size()<<endl;return 0;
}
//3085
//300  

2015完美正方形

#include<bits/stdc++.h>
using namespace std;int n = 47 + 46 + 61;//边长
int a[19] = {2, 5, 9, 11, 16, 17, 19, 21, 22, 24, 26, 30, 31, 33, 35, 36, 41, 50, 52};
int g[500][500];//大正方形地图
int vis[30];
set<int> se;//集合存储正方形最后一行边长数据结果void fill(int x,int y,int l,int num){for(int i=x;i<=x+l-1;i++){for(int j=y;j<=y+l-1;j++){g[i][j] = num;}}
}bool ok(int x,int y,int l){if(x+l-1 > n) return false;if(y+l-1 > n) return false;for(int i=x;i<=x+l-1;i++){for(int j=y;j<=y+l-1;j++){if(g[i][j] != 0) return false;}}return true;
}bool check(){return true;
}void dfs(int x,int y){if(x == n+1){//递归出口 if(check()){for(int i=1;i<=n;i++){se.insert(g[n][i]);//set集合存储最后一层正方形边长数据 }}return;}if(g[x][y] != 0 ){//当前正方形填充过了 if(y == n) dfs(x+1,1);//dfs下一个 else dfs(x,y+1);//dfs下一个 }else{//当前正方形没有填充过 for(int i=0;i<19;i++){//枚举19块正方形 if(!vis[i]){if(ok(x,y,a[i])){fill(x,y,a[i],a[i]);//填充正方形成a[i]边长 以(x,y)为左上顶点 vis[i] = 1;if(y == n){dfs(x+1,1);//dfs下一个 }else{dfs(x,y+1);//dfs下一个 }vis[i] = 0;//回溯 fill(x,y,a[i],0);//填充正方形成0 以(x,y)为左上顶点}else{break;//剪枝 因为a数组按顺序排的 当前边长不行 后面边长更不行了 }}}}}int main(){fill(1,1,47,47);//填充以(1,1)为左上顶点的正方形 边为47 fill(1,47+1,46,46);fill(1,47+46+1,61,61);dfs(1,1);//从(1,1)点开始搜索 set<int>::iterator it = se.begin();while(it!=se.end()){cout<<*it<<" ";it++;}return 0;
}
//30 33 41 50

转载于:https://www.cnblogs.com/fisherss/p/10897941.html

蓝桥杯dfs搜索专题相关推荐

  1. 【蓝桥杯】搜索专题总结——真题讲解

    写在前面 小伙伴们我们又见面啦~这篇文章拖了又拖,终于写完啦.这篇讲了几道蓝桥杯中考察DFS和BFS的真题,大家可以去看看前面两篇文章,对搜索讲的很详细.[一万字]蓝桥杯算法竞赛备考(一)--搜索专题 ...

  2. 【算法】蓝桥杯dfs深度优先搜索之排列组合总结

    [导航] 上一篇文章 → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,再次声明下文的大部分灵感均来自于[CSDN]梅森上校<JAVA版本:DFS算法题解两 ...

  3. 【算法】蓝桥杯dfs深度优先搜索之图连通总结

    前言 上两篇文章 → <[算法]蓝桥杯dfs深度优先搜索之排列组合总结>      → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,第三次声明下文的 ...

  4. Python冲击省一蓝桥杯 DFS集锦

    距离蓝桥杯38天 话不多说 直入主题 耐心看完 一定会对你有所帮助 有什么不懂的随时可以私信小郑 深搜虽然很难 但总要面对 如果总是逃避 那就很难进步! 下面呈现的内容将以题目来源+题目分析+代码+知 ...

  5. 蓝桥杯 DFS经典题 —— 算式900、寒假作业(告别枚举法)

    类似于 算式 900.寒假作业这种题目,可以直接暴力破解,但是它非常的浪费时间,而且程序不是太过于美观,很容易让我们对算法失去兴趣,今天,我们告别传统的暴力破解,使用伟大搜索算法 -- DFS(深度优 ...

  6. 蓝桥杯 密文搜索(全排列)

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

  7. 蓝桥杯T35 危险系数(DFS)

    title: 蓝桥杯T35 危险系数(DFS) date: 2018-11-26 17:30:39 tags: [算法,蓝桥杯,DFS] categories: [算法] Description 抗日 ...

  8. 蓝桥杯笔记:DFS(深度优先搜索)解决问题

    DFS: 深度优先搜索: 访问当前的元素后,递归访问元素的邻接元素(找出所有下一步的可能元素,判断是否能访问),撤回当前元素访问 dfs(当前状态) {//递归终止条件if(当前状态==结束状态) { ...

  9. 蓝桥杯2017初赛:迷宫 (dfs搜索)

    [蓝桥杯2017初赛]迷宫 Description X星球的一处迷宫游乐场建在某个小山坡上.它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母.我们假设玩家是面朝上坡的方向站立, ...

最新文章

  1. 2D简单图形相关算法罗列
  2. [InnoDB系列] -- SHOW INNODB STATUS 探秘
  3. 硬核图解,再填猛将!
  4. 算法—回溯法桥本分数式
  5. 【C++ Primer | 08】课后习题答案
  6. Android 后台线程Thread调用前台线程Handler,延时线程,runOnUiThread使用,Timer延时,定时循环,倒计时
  7. C语言目录文件操作补充
  8. ajax servlet怎么接收_【百战程序员从开始到植发】之AJAX
  9. 一天一个小技巧(4)——利用Python和MATLAB进行图片二值化
  10. 《Windows内核原理与实现笔记》(一)Windows系统结构和基本概念
  11. jvisualvm监控本地jvm
  12. 三种局域网扫描工具比较
  13. c语言幂函数_了解C / C ++中的幂函数
  14. notepad拼心形_用shell脚本写个心形动画表格
  15. 用python画皮卡丘代码-用python画一只可爱的皮卡丘实例
  16. flexray unknown message
  17. Python开发 之 Python3读写Excel文件(较全)
  18. socket通信read丢失数据可能原因
  19. 【福利分享】java书籍推荐!
  20. RISC-V BOOM核学习

热门文章

  1. css鼠标拖拉卡顿_66个值得收藏的CSS开发技巧
  2. python123第九周测验答案2020_脑筋急转弯:什么牛是最好骗的?这答案能笑死人...
  3. pythontransform详解_Python自定义聚合函数merge与transform区别详解
  4. kmem 反编译linux内核_24小时学通Linux内核之如何处理输入输出操作
  5. java中关于x轴翻转和y轴翻转如何计算_如何用加速度计提高倾角测量精度?
  6. 系统学习NLP(十二)--文本表示综述
  7. 图论(三)--各种基础图算法总结
  8. JDBC 8.0 和 JDBC 5.0 区别
  9. 高中信息技术——Flash动画制作刷题点整理(二)
  10. C语言——指针篇(二)指针和数组之内存分配和初始化