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. Windows10 安装grpc-go 详细步骤

    准备依赖 git clone https://github.com/grpc/grpc-go.git $env:GOPATH\src\google.golang.org\grpc git clone ...

  2. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) E. Arson In Berland Forest 二分 前缀和

    E. Arson In Berland Forest The Berland Forest can be represented as an infinite cell plane. Every ce ...

  3. Python程序中的线程操作-守护线程

    目录 一.守护线程 1.1 详细解释 1.2 守护线程例1 1.3 守护线程例2 一.守护线程 无论是进程还是线程,都遵循:守护xx会等待主xx运行完毕后被销毁.需要强调的是:运行完毕并非终止运行. ...

  4. 记录使用echarts的graph类型绘制流程图全过程(二)- 多层关系和圆形图片的设置

    本文主要记录在使用echarts的graph类型绘制流程图时候遇到的2个问题:对于圆形图片的剪切和多层关系的设置 图片的设置 如果用echarts默认的symbol参数来显示图片,会显示图片的原始状态 ...

  5. 【文本处理命令】之sed命令详解

    sed行处理命令详解 一.简介 sed命令是一种在线编辑器.一个面向字符流的非交互式编辑器,也就是说sed不允许用户与它进行交互操作.sed是按行来处理文本内容的,它一次处理一行内容.处理时,把当前处 ...

  6. pytest框架与unittest框架的对比

    一.pytest的优势 pytest是基于unittest之上的单元测试框架,它的优势如下: 自动发现测试模块和测试方法 断言使用 assert + 表达式 可以设置测试会话级(session).模块 ...

  7. 玩下PHP的分词,最近有这个需求

    找了个地方 下载代码 我是在这里下载的 https://www.jb51.net/codes/65593.html 1 下载完毕后  打开是这样的文件 2  先把代码集成到thinkphp3.2.3里 ...

  8. 【Ajax】Ajax入门总结

    目录 Ajax( Asynchronous JavaScript and XML ) 向服务器发送请求 服务器回应请求 本文内容总结自 w3cschool: https://www.w3school. ...

  9. Java学习笔记 DbUtils数据库查询和log4j日志输出 使用

    DbUtils使用 QueryRunner DbUtils中定义了一个数据库操作类QueryRunner,所有的数据库操作CRUD都是通过此类来完成. 此类是线程安全的 方法名 对应sql语句 exc ...

  10. C# rename files

    static void RenameFiles() { string sourceDir = @"D:\ll"; string[] allFiles = Directory.Get ...