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);
else
dfs(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+1
2.继续加值 (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

 

 

蓝桥杯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. android binder 进程间通信机制4-Service Manager

    Service Manager 是Binder进程间通信的核心组件之一: 它扮演者Binder进程间通信上下文(Context Manager)的角色 负责管理系统中的Service组件 向Clien ...

  2. SPA项目开发之tab页实现

    实现思路及细节 1.利用前面博客所讲的Vuex的知识:定义几个变量 Options:存放tab页对象的容器(主要是路由路径以及tab页的名字) activeIndex:被激活的tab页路由路径 sho ...

  3. windows下redis作为系统服务如何重启

    第一种方法: 键入win+R打开运行对话框,键入Services.msc打开windows服务窗口,找到redis服务,先停止该服务,然后再启动 第二种方法: 键入win+R打开运行对话框,键入cmd ...

  4. CF1248F Catowice City

    题目链接 problem 有\(n\)个人,每个人家有一只猫.每个人都认识一些猫(其中肯定包括自己家的猫).选出\(j\)个人和\(k\)只猫\((j,k\ge 1)\).使得\(j+k=n\)且选出 ...

  5. Spring中注解方式实现IOC和AOP

    1.IOC注解 1.1 IOC和DI的注解  IOC: @Component:实现Bean组件的定义 @Repository:用于标注DAO类,功能与@Component作用相当 @Service:用 ...

  6. 想成为Python高手,必须看这篇爬虫原理介绍!(附29个爬虫项目)

    互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现我们眼前. 一.爬虫是什么? 如果我们 ...

  7. 【Oracle命令】sql语句之排序(order by)

    通过对数据库数据进行降序排序来达到显示最新数据在前面的效果 -- 降序排序(最新的显示在前面) SELECT * FROM 表名 t ORDER BY t.uploadDatetime DESC; 格 ...

  8. 踩过了这些坑,你真的懂python基础吗?

    一.浮点数的计算 思考1:打印结果是什么? a = 0.1 b = 0.2 c = 0.3 print(b == a + a) 思考2:打印结果是什么? a = 0.1 b = 0.2 c = 0.3 ...

  9. 拎壶学python3-----(2)python之if语句用法

    在生活中我们经常遇到各种选择,比如玩色子,猜大小,再比如选择未来另一半.python也经常会遇到这样的选择,这时候if语句显得尤为重要. 下边我们看一个简单的例子 如果是二选一怎么做呢?如下 如果多个 ...

  10. 华为mate10 pro内置浏览器出现的令人头疼的样式兼容问题

    问题描述:   下图红色框区域内容在华为mate10 pro(以下简称mate10)内置浏览器中整体向左偏移,没有居中,其它手机浏览器都无该问题,如下图 问题分析   经过一番追根溯源,我发现是 bo ...